相对于另一个表的列中的预设数据,如何查找列中不存在的数据

时间:2019-02-15 09:22:12

标签: mysql sql ms-access

我需要一个SQL代码来比较一个表中不存在的数据和另一个表中保存的一组唯一预期数据的数据。

我尝试使用EXIST和NOT EXIST运算符。

EXIST运算符将在第二个表中显示所有数据。 NOT EXIST运算符将不会显示任何结果。

代码看起来像

SELECT * 
FROM st 
WHERE EXISTS 
(SELECT data FROM udt WHERE st.data <> udt.data) 

这是我唯一的数据表(udt)示例:

+------+
| data |
+------+
|   1  |
|   2  |
|   3  |
|   4  |
+------+

这是我的第二个表(st)示例:

+------+------+
| name | data |
+------+------+
|  AZ  |   1  |
|  AZ  |   3  |
|  BY  |   2  |
|  BY  |   4  |
|  CX  |   1  |
|  CX  |   4  |
|  DW  |   2  |
|  DW  |   3  |
+------+------+

我想要一个代码来显示名称和第二个表中不存在的代码。那就是:

+------+------+
| name | data |
+------+------+
|  AZ  |  2   |
|  AZ  |  4   |
+------+------+ 

以此类推

有可能吗?如果可能,我可以应用哪种代码语法? 我知道为什么EXIST和NOT EXIST不会显示数据,但是有什么方法可以获取所需的结果?

2 个答案:

答案 0 :(得分:0)

不确定这是否是最好的方法,现在还很早,还没有多少咖啡:o)

我已经更改了您的字段名称,但请使其与您的字段尽可能近。

select q1.[name_],q1.data1
from
(select distinct [name_],data1 from 
st,udt) as q1
left join
st as d1
on q1.[name_]=d1.[name_] and
q1.data1=d1.[data_]
where d1.[name_] is null

为您提供结果

名称数据1

az 2

az 4

by 1

by 3

cx 2

cx 3

dw 1

dw 4

答案 1 :(得分:0)

生成名称和数据的所有组合,然后删除第二个表中的组合。

在几乎所有数据库中,您都可以这样操作:

select n.name, t1.data
from (select distinct name from table2) n cross join
     table1 t1 left join
     table2 t2
     on t2.name = n.name and t2.data = t1.data
where t2.data is null;

MS Access不支持此语法,因此您可以这样做:

select n.name, t1.data
from (select distinct name from table2) n, 
     table1 t1
where not exists (select 1
                  from table2 t2
                  where t2.name = n.name and t2.data = t1.data
                 );