0

他のすべての回答が機能すると言っているので、私は奇妙に感じますが、正しい結果を得ることができません:(

table A: id_num, name<br>
table B: id_num

table A has index on name, but not unique. id_num is unique in this table.<br>
table B has index on id_num, but not unique.

テーブルBにないテーブルAの名前を取得したい.

これは機能しません:

**SELECT a.name FROM a 
LEFT JOIN b ON (a.id_num = b.id_num) 
WHERE b.id_numb IS NULL**

テーブルbにある名前を返します(そうでないものもあります)。

これもうまくいきませんでした:

**SELECT distinct(a.name) 
FROM a where a.id_num 
not in (select distinct(b.id_num) from b  )**

SQLがNOT INと言っているときに、a.namesがテーブルBにいる人を返す方法を理解できません。私は何が欠けていますか?

ありがとう

4

2 に答える 2

0

当然のことながら、動作するleft joinはずです。そしてと同様にin

これがサンプルです。したがって、質問の正義を高めるために、テーブルスキーマとデータを公開して表示することをお勧めします。SQLFIDDLEでテーブルを作成し、参照を表示できる場合に最適です。;)

ここにサンプルがあります:-

サンプルテーブル:tab1:

   COL1     COL2
    1       john
    2       tim
    3       jack
    4       rose

tab2:

   COL3     COL4
    1       2
    2       3
    3       5
    4       5
    5       2

クエリ:

select * from tab1
where col1 not in 
(select distinct col4 from tab2)
;

結果:

COL1    COL2
1       john
4       rose

OPの更新されたコメントとテーブル構造に従って

  • OPは、テーブルtab1には同じ名前の複数のレコードがあると述べました。彼の元のテーブルデザインによると、テーブルタブ2には名前フィールドがありません。OPが最初に期待される結果を提供していた場合にも、これは大いに推奨されます。

* SQLFIDDLEリファレンス

OPのテーブルデータ:

COL1    COL2
1       john
2       tim
3       jack
4       rose
5       john
6       john

COL3    COL4
1       2
2       3
3       5
4       5
5       2
6       6

クエリ:重複する名前が必要ない場合

select t.col1, t.col2
from tab1 t
join 
 (select t1.col2, count(*) as counts 
  from tab1 t1
  group by t1.col2
  having count(*) = 1) x
on t.col2 = x.col2
where t.col1 not in 
 (select distinct col4 from tab2)
;

結果:これがRoseです。これは、重複がなく、tab2に存在しない唯一のレコードです。

COL1    COL2
4       rose
于 2012-12-20T23:10:26.553 に答える
0

これを試して

    select t1.name from table1 t1
     where t1.name not in 
               (select t2.name from table2 t2 )

デモSQLFIDDLEを見て ください

編集:

id_num2番目のテーブルにしかない場合は、ここを見てください

このデモSQLFIDLE

于 2012-12-20T23:19:33.127 に答える