2

我需要做的是以下几点:

我的数据库中有一个这样的表:

idx   |   name   |   age
------ ---------- -------
 1    |   John   |    18
 2    |   Marry  |    19
 3    |   Eric   |    17

然后我得到一个secondTable:

name  |  age
------ -----
Moses |   29
John  |   18
Eric  |   20

我想运行一个 except 查询,例如:

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”,它会将它们视为未知(既不相等也不不相等)。我知道原因,但我确实需要他们平等。

我需要这样做的原因是为了将当前索引值保留到查询结果中。

4

2 回答 2

0

试试这个:

 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 和 union 两个表中显示:

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)
于 2017-03-10T08:18:41.410 回答
0

您只需要将处理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)
                    )
             );

应该像魅力一样工作。=)

于 2017-03-10T09:45:16.127 回答