2012-01-06 39 views
2

我有下表:compare。我需要做一个内部联接与products表:SQL满足条件时排除结果吗?

idCompare idProduct dateStamp 
1   1   2011-12-12 
2   1   2011-12-10 
3   1   2012-01-05 

我想从我的结果排除idproduct的其中是否有个约会中说7天。

我使用NOT IN尝试和NOT EXISTS没有成功

SELECT  products.idProduct 
FROM   products INNER JOIN 
      compare ON products.idProduct = compare.idProduct 
WHERE 
(products.idProduct = '1') AND (products.idProduct 
    NOT IN 
    (SELECT  idProduct 
    FROM   compare 
    WHERE  (products.idProduct = compare.idProduct) AND 
    (dateStamp < DATEADD(DAY, - 7, GETDATE())))) 
+0

即使您将其定义为“1”,您仍在选择'products.idProduct'。这是故意的吗? – kba 2012-01-06 22:21:15

+0

我只是测试这个1例子,最终我会删除(products.idProduct ='1') – Standage 2012-01-06 22:24:19

+0

你不需要加入'ON products.idProduct = compare.idProduct'吗?你也希望在最后一行用'>'或'> ='代替'<',不是吗? – 2012-01-06 22:24:24

回答

2

看起来是这样的:

SELECT p.idProduct 
FROM products AS p 
WHERE NOT EXISTS (
    SELECT * 
    FROM compare AS c 
    WHERE c.idProduct = p.idProduct 
    AND c.dateStamp BETWEEN DATEADD(DAY, - 7, GETDATE()) AND GETDATE() 
    ) 

唐此外,还可以将JOIN转换为表compare。根据你的描述,用NOT EXISTS检查就足够了。

+0

这似乎也适用,谢谢 – Standage 2012-01-06 22:28:44

+0

这将选择没有比较的产品,而原来不会。 – 2012-01-06 22:29:41

+0

是的,没有加入需要!这是更有效的答案。非常感谢 – Standage 2012-01-06 22:45:41

2

试试这个你not exists

select 
    * 
from 
    products p 
    inner join compare c on 
     p.idProduct = c.idProduct 
where 
    not exists (
     select 
      1 
     from 
      compare c2 
     where 
      c2.idProduct = p.idProduct 
      and c2.datestamp between dateadd(day, -7, getdate()) and getdate() 
    ) 
+0

您发现连接条件不匹配。 – 2012-01-06 22:25:56

+0

似乎已经解决了我的问题。干杯 – Standage 2012-01-06 22:27:49