1

请查看此声明:

   SELECT TableID FROM Table t1
   INNER JOIN BlackList b ON b.TableID <> t1.TableID

我在想这个语句返回TableBlacklist表中没有的所有内容,但它根本没有返回任何内容(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

但我一直在寻找一种更短、更有效的解决方案。有什么建议么?

4

4 回答 4

5
SELECT TableID FROM dbo.Table
EXCEPT
SELECT TableID FROM dbo.Blacklist;
于 2012-04-22T22:13:02.743 回答
2

一种基本方法是使用NOT EXISTS

SELECT TableID FROM Table t1
where NOT EXISTS (select * from BlackList b where b.TableID = t1.TableID);

这将选择表t1中不存在的行BlackList

于 2012-04-22T22:12:47.980 回答
1
SELECT TableT1.TableId FROM TableT1  
LEFT OUTER JOIN BlackList ON  
TableT1.TableID = BlackList.TableID  
where BlackList.TableId IS NULL

我写了上面的,但现在我还在StackOverflow中找到了一个以前的问题/答案: 如何在一个表中找到另一个表中没有对应行的行

于 2012-04-22T22:17:14.987 回答
0

还:

SELECT TableId FROM Table
WHERE TableId NOT IN (SELECT TableID FROM BlackList)

无论您在主选择语句中添加什么列,这都将起作用。

于 2012-04-22T22:19:13.167 回答