请查看此声明:
SELECT TableID FROM Table t1
INNER JOIN BlackList b ON b.TableID <> t1.TableID
我在想这个语句返回Table
表中找不到的Blacklist
的所有内容,但它根本没有返回任何内容(0行)。如果我试图返回Table
表中未找到的Blacklist
内的所有内容,那么最好的方法是什么?我假设你可以这样做:
SELECT TableID FROM (
SELECT TableID, CASE WHEN b.TableID IS NULL THEN 1 ELSE 0 END OnBlackList
FROM Table t1
LEFT JOIN Blacklist b ON b.TableID = t1.TableID
) tb1
WHERE tb1.OnBlackList = 0
但我一直在寻找更短,更有效的解决方案。有什么建议吗?
答案 0 :(得分:5)
SELECT TableID FROM dbo.Table
EXCEPT
SELECT TableID FROM dbo.Blacklist;
答案 1 :(得分:2)
一种基本方法是使用NOT EXISTS
:
SELECT TableID FROM Table t1
where NOT EXISTS (select * from BlackList b where b.TableID = t1.TableID);
这将选择t1
表格中不存在的BlackList
中的行。
答案 2 :(得分:1)
SELECT TableT1.TableId FROM TableT1
LEFT OUTER JOIN BlackList ON
TableT1.TableID = BlackList.TableID
where BlackList.TableId IS NULL
我写了上面的内容,但现在我在StackOverflow中找到了之前的问题/答案: How to find rows in one table that have no corresponding row in another table
答案 3 :(得分:0)
此外:
SELECT TableId FROM Table
WHERE TableId NOT IN (SELECT TableID FROM BlackList)
无论您在主select语句中添加哪些列,这都将起作用。