其中(不存在)(选择 id..只是有时它确实存在



我有2张桌子。我想从一个表中选择一个 Id,而另一个表中不存在一行基于日期... 只有我似乎无法在第二个表中找到正确的行

表1

adId    info        tableX      tableY
1       blah, blah     Y          N
2       blah, blah     N          Y
3       blah, blah     N          N
4       blah, blah     N          Y
5       blah, blah     N          Y

表2

id      start_date  unitId      adId
1       2014-04-01    1          1
2       2014-03-02    2          1
3       2014-04-01    2          2
4       2014-03-01    0          4

2中unitID的关系来自两个表X和Y(我不确定它是否相关,但我会描述它以防万一)

表X

unitId    adid
1          1
2          1

表 Y

unitId    adId
1           5
2           2
3           4
我想从表 1 中选择 adId=1、adId=

3、adId=5,如表 2 所示,它们都没有三月的日期(注意 adId=2 和 5 根本没有出现在表 2 中)

这将找到 adId= 2 和 5,但不会找到 1。

When I do SELECT TOP (100) PERCENT Table1.adId
FROM Table1
WHERE (NOT EXISTS
       (SELECT id, start_date
     FROM Table2
         WHERE (Table1.adId = adId) AND (Table2.start_date BETWEEN '2014-03-01'AND '2014-03-05)
    )
       )

你如何添加一个子句,以便它在adId和UnitID上寻找DISTINCT?

DISTINCT是解决这个问题的最佳方式还是有其他方法?

  SELECT A.* 
  FROM Table1 A
  WHERE NOT EXISTS 
    ( SELECT 1 
        FROM Table2 B 
       WHERE B.start_date BETWEEN '2014-03-01'AND '2014-03-05' 
         AND B.adId = A.adId )

你的方法似乎过于复杂。这个怎么样:

SELECT adId
FROM Table1
WHERE adId NOT IN
    (SELECT adId
     FROM Table2
     WHERE start_date BETWEEN '2014-03-01' AND '2014-03-05')

作为替代方案,如果您强烈反对 WHERE 条件中的子查询,您可以执行以下操作:

SELECT Table1.adId
FROM Table1 LEFT JOIN (SELECT adId
     FROM Table2
     WHERE start_date BETWEEN '2014-03-01' AND '2014-03-05') T2
     ON Table1.adId=T2.adId
WHERE T2.adId=NULL

您还可以使用 MINUS set 运算符:

select adId
  from table1
 where start_date not between '2014-03-01' AND '2014-03-05'
minus
select adId
  from table1
 where start_date between '2014-03-01' AND '2014-03-05'

相关内容

最新更新