0

我有一个 SQL 表,其中包含列中的城市列表。我有一个单独的城市列表,我想找出表中存在和不存在的城市,但分别不存在和存在于该列表中的城市。

例子

CityId    CityName
1            ABC
2            DEF
3            GHI
4            JKL
5            MNO

假设列表是:'ABC'、'DEF'、'MNO'、'PQR'、'STU'

所以作为输出我想要两个列表:

存在于表中:

'ABC' 
'DEF' 
'MNO'

不存在于表中:

'PQR'
'STU'
4

3 回答 3

1

我假设您的列表是一个字符串/varchar,那么您首先需要一个拆分函数来获取所有部分:

1.) 然后可以使用 anINNER JOIN查找表中的所有内容:

SELECT CityId,CityName
FROM Cities c
INNER JOIN dbo.Split('ABC,DEF,MNO,PQR,STU',',')x
ON c.CityName = x.Item;

2.)并 NOT EXISTS 查找列表中但不在表中的所有内容:

SELECT x.Item As CityName
FROM  dbo.Split('ABC,DEF,MNO,PQR,STU',',')x
WHERE NOT EXISTS 
(
  SELECT 1 
  FROM Cities c
  WHERE c.CityName = x.Item
)

演示

结果:

1)

CITYID  CITYNAME
  1       ABC
  2       DEF
  5       MNO

2)

CITYNAME
PQR
STU

这是我的拆分功能:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  
于 2013-02-18T16:22:03.650 回答
0

看起来您的“列表”在表格中。这应该很简单:

select distinct value from list where value in (select distinct city from cities)

和:

select value from list exclude select city from cities
于 2013-02-18T16:39:24.250 回答
0

存在于表值中:

SELECT v.valueName AS PresentInTable from (VALUES ('ABC'),('DEF'),('MNO'),('PQR'),('STU')) 
v(valueName) 
LEFT JOIN Cities c on c.CityName = v.valueName
WHERE c.CityId IS NOT NULL

不存在于表中:

SELECT v.valueName AS NotPresentInTable from (VALUES ('ABC'),('DEF'),('MNO'),('PQR'),('STU')) 
v(valueName) 
LEFT JOIN Cities c on c.CityName = v.valueName
WHERE c.CityId IS NULL
于 2016-02-26T13:13:58.223 回答