2

私は2つのテーブルを持っています:

広告 :

+------+---------------+
|  ID  |  Name         |
+------+---------------+
| 1    |   Item 1      |
| 2    |   Item 2      |
| 3    |   Item 3      |
| 4    |   Item 4      |
| 5    |   Item 5      |
+------+---------------+

割り当てられた広告:

+------+-----------+--------------+
|  ID  |   ad_id   |  location    |
+------+-----------+--------------+
|  1   |    3      |  place 1     |
|  2   |    2      |  place 2     |
|  3   |    1      |  place 3     |
+------+-----------+--------------+

ご覧のように; 広告 1、2、3 はすべて場所に割り当てられています。必要なのは、テーブルadsに割り当てられていないテーブル内のすべての行を取得するクエリですassigned_ads

4

5 に答える 5

4

以下に示すように、これを行うには LEFT OUTER JOIN を使用する必要があります。

SELECT * 
FROM ads a
LEFT JOIN assigned_ads aa ON a.ID = aa.ad_id
WHERE aa.location IS NULL
于 2011-10-12T12:00:13.593 に答える
1

NOT EXISTS次の演算子を使用することもできます。

SELECT * 
FROM ads a
WHERE NOT EXISTS
(SELECT * FROM assigned_ads aa WHERE a.ID = aa.ad_id)
于 2011-10-12T12:07:44.627 に答える
1

必要な関係演算子は、反結合とも呼ばれるセミ差分です

ほとんどの SQL 製品には、明示的な準結合演算子またはキーワードがありません。標準 SQL-92 にはそれがありません (MATCH (subquery)準結合述語がありますが、そうではないと考えたくなるかもしれませんが、 のセマンティクスはNOT MATCH (subquery)準差分と同じではありません。FWIW 真のリレーショナル言語のチュートリアル Dでは半差分をうまく使用していNOT MATCHINGます)。

もちろん、他の SQL 述語を使用して準差分を記述することもできます。最も一般的に見られるのは、WHERE句内の null のテストを伴う外部結合で、すぐ後にEXISTSorが続くものIN (subquery)です。使用するEXCEPT(Oracle と同等MINUS) は、SQL 製品がサポートしている場合に別の可能なアプローチであり、データによっては (具体的には、2 つのテーブルの見出しが同じ場合) 可能です。

個人的にはEXISTS、結合句が記述されたコードでより近くにあり、結合されたテーブルに対する射影が発生しないため、半差分結合に SQL で使用することを好みます。

SELECT *
  FROM ads 
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM assigned_ads
                    WHERE ads.ID = assigned_ads.ID
                  );

(外部結合アプローチとIN (subquery)同じ)と同様に、サブクエリ内の句にnullが含まれる場合は特に注意する必要がありますWHERE(ヒント:WHEREサブクエリの句がnullの存在によりUNKNOWNと評価された場合、強制的にFALSEになりますEXISTS、予期しない結果が生じる可能性があります)。

于 2011-10-13T09:16:56.787 に答える
0

ユーザーが結合クエリを残して、左のテーブル ID を null に一致させます。クエリは次のようになります

select * from ads ad left join assigned_ad a_ad ON a_ad.ad_id = ad.id where a_ad.id is null

左結合の詳細については、こちらを参照してください

于 2011-10-12T12:07:09.393 に答える
0

これを試して:

SELECT * 
FROM ads a
WHERE a.id NOT IN (SELECT ad_id FROM assigned_ads)
于 2011-10-12T12:01:11.993 に答える