使用子查询获取SQL Server结果

问题描述 投票:0回答:1

我有这样的Members表:

PersonID    FirstName   Address      City      date
---------------------------------------------------------
    3       Rasanga     Skagen 21    South     2019-01-05

Persons表:

PersonID  FirstName   Address     City       date
-------------------------------------------------------
   3      Rasanga     Skagen 21   South      2019-01-06
   1      Tom B.      Skagen 21   Colombo    2018-01-07
   2      Tom B.      Skagen 21   Colombo    2019-01-05

我想使用Persons列获取Members表中不存在的FirstName。为此,我使用此查询:

SELECT * 
FROM Persons p
WHERE NOT EXISTS (SELECT * FROM Members m WHERE m.FirstName = p.FirstName)

[执行上述查询时,我得到相同的名字和2条记录,但是我的要求是如果有2条相同名称的记录使用date列检索最新记录。因此,以上情况应该是Tom B.的2018-01-07记录。如果两个记录的日期相同,则应从2个记录中检索1个记录。

有人可以解释如何做吗?

sql-server subquery relationship
1个回答
0
投票

您可以使用left join并检查Members.PersonId是否为null

create table Members(PersonID int
, FirstName varchar(20)
, Address varchar(50)
, City varchar(50)
, Dtdate date)

insert into Members values
(3, 'Rasanga', 'Skagen 21', 'South', '2019-01-05')

Create table Persons(PersonID int
, FirstName varchar(20)
, Address varchar(50)
, City varchar(50)
, Dtdate date)

insert into Persons values
(3, 'Rasanga', 'Skagen 21', 'South', '2019-01-06'),
(1, 'Tom B.', 'Skagen 21', 'Colombo', '2018-01-07'),
(2, 'Tom B.', 'Skagen 21', 'Colombo', '2019-01-05')

Select Persons.* from Persons
left join Members on Persons.PersonID = Members.PersonID
where Members.PersonId is null

Demo

使用not exists,您可以如下所示进行检查。

SELECT Persons.*
FROM   Persons
WHERE  NOT EXISTS (SELECT 1 
                   FROM  Members 
                   WHERE  Persons.PersonID = Members.PersonID)

使用in运算符

SELECT * FROM Persons
WHERE PersonID NOT IN (
 SELECT PersonID FROM Members
)
© www.soinside.com 2019 - 2024. All rights reserved.