Есть ли способ запустить запрос исключения на 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)
Другие вопросы по тегам