我有一个SQL表,其中包含列中的城市列表。 我有一个单独的城市列表,我想找出表中没有的城市,但是不存在并分别出现在该列表中。
实施例
CityId CityName
1 ABC
2 DEF
3 GHI
4 JKL
5 MNO
说清单是: 'ABC','DEF','MNO','PQR','STU'
因此输出我需要两个列表:
出现在表格中:
'ABC'
'DEF'
'MNO'
表中不存在:
'PQR'
'STU'
答案 0 :(得分:1)
我认为你的列表是一个字符串/ varchar,然后你首先需要一个split-function来获取所有部分:
1。)然后可以使用INNER 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
答案 1 :(得分:0)
看起来你的“列表”在表格中。这应该是简单的:
select distinct value from list where value in (select distinct city from cities)
和
select value from list exclude select city from cities
答案 2 :(得分: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