Как найти данные, отсутствующие в столбце, относительно предварительно заданных данных в столбце другой таблицы - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужен код 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  |
+------+

Это мой второй табличный пример:

+------+------+
| 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 голосов
/ 15 февраля 2019

Создайте все комбинации имени и данных и затем удалите те, которые находятся во второй таблице.

Практически в любой базе данных вы можете сделать это следующим образом:

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;

MSAccess не поддерживает этот синтаксис, поэтому вы можете сделать:

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
                 );
0 голосов
/ 15 февраля 2019

Не уверен, что это лучший способ сделать это, пока рано и не так много кофе: 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

Дает вам результаты

имя data1

az 2

az 4

от 1

3

cx 2

cx 3

dw 1

dw 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...