11

クエリを機能させるのに問題がありますが、うまくいくはずです。という形になっています

SELECT DISTINCT a, b, c FROM t1 WHERE NOT IN ( SELECT DISTINCT a,b,c FROM t2 ) AS alias

しかし、mysql は "IN (" が始まる場所をチョークします。mysql はこの構文をサポートしていますか? サポートしていない場合、これらの結果を取得するにはどうすればよいですか? テーブル 1 に存在しない (a,b,c) の個別のタプルを見つけたい表2で。

4

6 に答える 6

14

not exists を使用する必要があります。

SELECT DISTINCT a, b, c FROM t1 WHERE NOT EXISTS (SELECT NULL FROM t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)

キーを 1 つだけチェックする場合でも、NOT IN を使用するのは最適な方法ではありません。その理由は、NOT EXISTS を使用する場合、DBMS は必要な列のインデックスが存在する場合にのみインデックスをチェックする必要があるためです。一方、NOT IN の場合は、実際のデータを読み取り、後でチェックする必要がある完全な結果セットを作成する必要があります。 .

LEFT JOIN を使用してから NULL をチェックすることも悪い考えです。テーブルが大きい場合、クエリが結合全体を作成し、両方のテーブルを完全に読み取り、その後その多くを破棄する必要があるため、非常に遅くなります。また、列で NULL 値が許可されている場合、NULL をチェックすると誤検知が報告されます。

于 2010-02-11T18:30:41.933 に答える
4

回答が提供されていても、このクエリを実行する正しい方法を見つけるのに苦労しました。次に、必要な MySQL ドキュメント リファレンスを見つけました。

SELECT DISTINCT store_type
FROM stores 
WHERE NOT EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);

私が頭を悩ませなければならなかったトリックは、サブクエリ内の最初のクエリから「stores」テーブルへの参照を使用することでした。これが役立つことを願っています(または、これは古いスレッドであるため、他の人を助けます)。

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.htmlから

于 2012-07-26T22:24:28.580 に答える
0

SELECT DISTINCT t1.* FROM t1 LEFT JOIN t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) WHERE t2.a が NULL の場合

于 2010-02-11T18:20:02.003 に答える
0

私の知る限り、NOT IN は一度に 1 つのフィールドにしか使用できません。また、フィールドは「WHERE」と「NOT IN」の間に指定する必要があります。

(編集:) NOT EXISTS を使用してみてください:

SELECT a, b, c 
FROM t1 
WHERE NOT EXISTS 
   (SELECT * 
   FROM t2 
   WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)

さらに、チャールズが以下で述べたように、a、b、および c の内部結合はすべての非 DISTINCT タプルを提供する必要がありますが、WHERE IS NULL 句を使用した LEFT JOIN は DISTINCT タプルを提供する必要があります。

于 2010-02-11T18:00:12.360 に答える
0

さて、私は自分自身の質問に答えるつもりです.他の人が与えたすべての素晴らしいアドバイスにもかかわらず.

これが、私がやろうとしていたことの適切な構文です。

SELECT DISTINCT a, b, c FROM t1 WHERE (a,b,c) NOT IN ( SELECT DISTINCT a,b,c FROM t2 )

その効率性を保証することはできませんが、暗黙のうちに出していたより広範な質問は、「特定の結果セットを取得する方法」ではなく、「この考えを SQL でどのように表現するか」でした。刺し傷を負ったすべての人にとって不公平であることはわかっています、ごめんなさい!

于 2010-02-12T03:09:59.600 に答える
-1

WHERE 句の後に列リストを追加し、エイリアスを削除する必要があります。

これを同様のテーブルでテストしたところ、機能しています。

SELECT DISTINCT a, b, c 
FROM t1 WHERE (a,b,c)
NOT IN (SELECT DISTINCT a,b,c FROM t2)

mysqlワールドデータベースを使用する場合:

-- dont include city 1, 2
SELECT DISTINCT id, name FROM city 
WHERE (id, name) 
NOT IN (SELECT id, name FROM city  WHERE ID IN (1,2))
于 2010-02-11T18:36:13.943 に答える