我有以下结构的表:
表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'是包含所有元素的表。在此表中,具有由条件创建的重复记录,并且此元素插入表'groups'中。在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中,因为这些项目是重复的。
答案 0 :(得分: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)
答案 1 :(得分:2)
此查询将按名称显示table1
中table2
以外的所有元素
也将过滤掉group
中存在的与table2
条目具有相同ID的所有条目(在您的情况下重复)。
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已更新。