我有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'