3

次の構造のテーブルがあります。

表1

| ID1 | NAME | GROUP_ID |
-------------------------
|   1 |  AAA |      101 |
|   2 |  A_A |      101 |
|   3 |  BBB |        0 |
|   4 |  CCC |      103 |
|   5 |  C_C |      103 |
|   6 |  DDD |        0 |
|   7 |  EEE |        0 |
|   8 |  FFF |        0 |
|   9 |  GGG |        0 |
|   10|  HHH |      104 |
|   11|  H_H |      104 |

テーブル2

| ID2 | NAME |
--------------
|   1 |  AAA |
|   2 |  BBB |
|   3 |  C_C |

グループ

| GROUP_ID | NAME |
-------------------
|      101 |  AAA |
|      101 |  A_A |
|      103 |  CCC |
|      103 |  C_C |
|      104 |  HHH |
|      104 |  H_H |

「table1」は、すべての要素を含むテーブルです。このテーブルには、基準によって作成された重複レコードがあり、この要素はテーブル「グループ」に挿入されています。table2 には、table1 の要素と一致する要素があります。

table2にないtable1のすべてのレコードを表示したい。table2 の要素がテーブル グループにある場合、このグループのすべての要素が結果テーブルに表示されません。この場合、要素は AAA/A_A (group_id 101) と CCC/C_C (group_id 103) です。

結果表

| ID1 | NAME | GROUP_ID |
-------------------------
|   6 |  DDD |        0 |
|   7 |  EEE |        0 |
|   8 |  FFF |        0 |
|   9 |  GGG |        0 |
|   10|  HHH |      104 |
|   11|  H_H |      104 |

A_A および C_C という名前の要素は、このアイテムが重複しているため、RESULT TABLE にありません。

私はこれを試しました: http://sqlfiddle.com/#!2/70253/3

4

2 に答える 2

2

どうですか:

使用済みグループの場合:

select * from table1
where NAME not in (SELECT distinct(name) FROM TABLE2)

用途に関係なく、すべてのグループに対して:

select * from table1
where NAME not in (SELECT distinct(name) FROM groups)

http://sqlfiddle.com/#!2/83b7c/45

于 2012-11-04T16:10:16.037 に答える
2

このクエリはtable1、存在しないすべての要素を名前で表示し、存在するエントリtable2と同じ id を持つすべてのエントリを除外します (この場合は重複しています)。grouptable2

select t1.* from table1 t1 left join groups g on t1.name=g.name 
left join table2 t2 on t2.name=t1.name
where (g.group_id is null or g.group_id not in (SELECT gg.group_id FROM TABLE2 t2 inner join groups gg on gg.name=t2.name))
and t2.id2 is null;

更新されたsqlFiddleを参照してください。

于 2012-11-04T16:16:01.737 に答える