2017-01-10 4 views
-5

以下の1つのクエリで選択する方法。このクエリは、独自のループに値を見つける再検索が必要です。mysqlはもう一度テーブルを2回選択します

にのみ

テーブルTのレコードと一致するように

| num| WHOSE   
| 1 | A  
| 1 | C 
| 2 | B  
| 2 | C  
| 3 | D 

基準(条件)1つのテーブルを用いて、他のサブ問合せは異なる:

  1. カラムの値is not C
  2. cの値NUMが条件1

に別のレコードの値と一致しないolumn私は(用Dを持っている)、カラムNUMのレコードに値3を見つけたいです。

select * from T where whose <> C and (num is not one of c's) 

1がカラムCを持っていないため、AはC 1件の

2 BがC 2

3 Dは、私が欲しいものであるていないことができていることができないのでためそのの数値には、Cのレコードを持つ共有の値はありません。

+0

JOINを参照してください。 – Strawberry

+0

1.英語pls。私はあなたが言っていることの言葉を理解していない! 2. MySQLとSQLサーバは2種類の製品です。あなたはどちらを使いますか? – Shadow

+0

データをテーブルに入れます。あなたの質問は本当に分かりにくいです – CodingYoshi

答えて

0

whoseCであるレコードのうち、最初にnumを選択します。次に、whoseCではないレコードと、numがサブクエリのレコードの1つでないレコードを選択します。

Select * from T where whose <> 'C' and num not in (Select Num from T where whose = 'C') 
0

同じ結果を達成するための別の方法は、同じテーブルの上にLEFT JOINである:結果がどこにある

SELECT T.* 
FROM T 
LEFT JOIN T t2 on t2.num = T.num and t2.whose = 'C' 
WHERE T.whose <> 'C' AND t2.whose IS NULL 

は、this SQL Fiddleでそれをチェックアウト:さらに

| num | whose | 
| 3 | D | 

、クエリを記述する同様の方法は、WHERE条件のNOT EXISTS節を次のように使用することです。

SELECT T.* from T 
WHERE T.whose <> 'C' AND NOT EXISTS (SELECT 1 FROM T t2 WHERE 
           t2.num = T.num AND t2.whose = 'C') 

this SQL fiddleでそれを確認してください。

EXISTSとLEFT JOINの比較について詳しくは、this articleを参照してください。最後の要約には、次の結論があります。

MySQLでは、NESTED LOOPS ANTI JOINのような3つの方法をすべて最適化できます。 ... しかし、これらの3つの方法は、3つの異なるコードによって実行される3つの異なる計画を生成します。 EXISTS述部を実行するコードは、約です。30%は、index_subqueryおよびLEFT JOINを実行するものよりも効率的ではありません。 MySQLので欠損値を検索するための最良の方法は、JOIN LEFTを使用している理由です

は/ではなく、IN、NOTはをEXISTS NOT NULLです。

関連する問題