Есть ли способ запустить запрос исключения на MSSQL, который использует только часть столбцов?
Что мне нужно сделать, это следующее:
В моей базе данных есть таблица, подобная этой:
idx | name | age
------ ---------- -------
1 | John | 18
2 | Marry | 19
3 | Eric | 17
Тогда я получаю второй стол:
name | age
------ -----
Moses | 29
John | 18
Eric | 20
Я хотел бы выполнить запрос кроме как:
select *
from firstTable
where (name, age) not in (select * from secondTable)
и запрос на пересечение, как это:
select *
from firstTable
where (name, age) in (select * from secondTable)
Таким образом, результат для первого запроса будет:
2 | Marry | 19
---- -------- ----
3 | Eric | 17
и результат для второго запроса будет:
1 | John | 18
Я также нашел решение, которое рекомендует следующее:
select *
from firstTable
where EXISTS (select 1
from secondTable
where firstTable.name = secondTable.name
and firstTable.age = secondTable.age))
но тогда, если у меня на обеих таблицах "john - null", они будут рассматриваться как неизвестные (ни равные, ни неравные). Я знаю причину этого, но мне нужно, чтобы они были равны.
Причина, по которой мне нужно это сделать, заключается в том, чтобы сохранить текущие значения индекса в результате запроса.
2 ответа
Вам просто нужно включить обработку NULL
значения в логику вашего запроса. Это было бы так:
SELECT *
FROM firstTable
WHERE EXISTS (SELECT TOP(1) 1
FROM secondTable
WHERE firstTable.name = secondTable.name
AND (
firstTable.age = secondTable.age
OR
(firstTable.age IS NULL AND secondTable.age IS NULL)
)
);
Должен работать как шарм. знак равно
Все от [A] ожидают [B]
SELECT ft.*
FROM [First_Table] ft
LEFT JOIN [Second_Table] sc ON ft.[name] = st.[name] AND ft.[age] = st.[age]
WHERE st.[name] IS NULL
AND st.[age] IS NULL
Все из [A] так же, как в [B]
SELECT ft.*
FROM [First_Table] ft
JOIN [Second_Table] sc ON ft.[name] = st.[name] AND ft.[age] = st.[age]
Попробуй это:
select distinct a.idx,a.name,a.age,b.name,b.age from first_table as a
inner join
second_table as b
on a.name = b.name and a.age = b.age
Этот отображает только запись с одинаковыми значениями first_table и second_table
И этот запрос Показать не во second_table и объединить обе таблицы, если имеет:
select distinct a.idx,b.name,b.age from first_table as a
inner join
second_table as b
on a.name = b.name and a.age = b.age
union all
select a.idx,a.name,a.age
from first_table as a where a.name not in(select name from second_table)