1

このステートメントを確認してください:

   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

しかし、私はより短く、より効率的なソリューションを探していました。助言がありますか?

4

4 に答える 4

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

基本的な方法の 1 つは、次を使用すること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 で以前の質問/回答も見つけました: How to find rows in one table that have no supported row in another table

于 2012-04-22T22:17:14.987 に答える
0

また:

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

これは、メインのselectステートメントで追加する列に関係なく機能します。

于 2012-04-22T22:19:13.167 に答える