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 中的元素匹配的元素。

我想显示 table1 中不在 table2 中的所有记录。如果 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 的所有group条目table2(在您的情况下为重复项)。

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 回答