有没有办法在仅使用部分列的MSSQL上运行except查询?

时间:2017-03-10 08:04:16

标签: sql-server sql-except

我需要做的是:

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

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您只需要在查询逻辑中包含处理<?xml version="1.0"?> -<OTA_HotelResRQ Version="2.2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -<Hotel xmlns="http://webservices.sabre.com/sabreXML/2011/10"> <BasicPropertyInfo RPH="001"/> <Customer NameNumber="01.01"/> -<Guarantee Type="G"> -<CC_Info> <PaymentCard Number="3782 8224 6310 005" ExpireDate="2021-09" Code="AX"/> -<PersonName> <Surname>tailor</Surname> </PersonName> </CC_Info> </Guarantee> <RoomType NumberOfUnits="1"/> </Hotel> </OTA_HotelResRQ> 值。它会是这样的:

NULL

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