你可以试试这个:
- 模拟式桌与您的数据
DECLARE @OrgData TABLE(OrgDataid INT,columvalues VARCHAR(100));
INSERT INTO @OrgData VALUES
(1,'1,2,3,4,5')
,(2,'6,7,8,9')
,(3,'16,17,18,19');
DECLARE @selectedData TABLE(rowid INT,[sid] INT,orgid INT,[values] VARCHAR(100));
INSERT INTO @selectedData VALUES
(1,1,1,'1,2')
,(2,1,2,'6,7,8,9')
,(3,2,1,'1,2,3,4,5');
- 第一个CTE拆分OrgData
WITH OrgDataSplitted AS
(
SELECT od.*
,LEN(od.columvalues)-LEN(REPLACE(od.columvalues,',',''))+1 AS CountParts
,B.Part.value('.','int') AS PartInt
FROM @OrgData AS od
CROSS APPLY(SELECT CAST('<x>' + REPLACE(columvalues,',','</x><x>') + '</x>' AS XML)) AS A(Casted)
CROSS APPLY A.Casted.nodes('/x') AS B(Part)
)
- - 第二个CTE拆分SelectedData
,SelectedSplitted AS
(
SELECT sd.*
,B.Part.value('.','int') AS PartInt
FROM @selectedData AS sd
CROSS APPLY(SELECT CAST('<x>' + REPLACE([values],',','</x><x>') + '</x>' AS XML)) AS A(Casted)
CROSS APPLY A.Casted.nodes('/x') AS B(Part)
)
--The查询加入他们
SELECT o.OrgDataid,o.CountParts,s.rowid,COUNT(rowid) AS CountIdent
FROM Orgdatasplitted AS o
FULL OUTER JOIN SelectedSplitted AS s ON o.OrgDataID=s.orgid and o.PartInt=s.PartInt
GROUP BY o.OrgDataid,o.CountParts,s.rowid
ORDER BY o.OrgDataid
结果。如果CountParts和CountIdent是相同它的全部,> 0是部分和0是没有
+-----------+------------+-------+------------+
| OrgDataid | CountParts | rowid | CountIdent |
+-----------+------------+-------+------------+
| 1 | 5 | 1 | 2 |
+-----------+------------+-------+------------+
| 1 | 5 | 3 | 5 |
+-----------+------------+-------+------------+
| 2 | 4 | 2 | 4 |
+-----------+------------+-------+------------+
| 3 | 4 | NULL | 0 |
+-----------+------------+-------+------------+
修复你的数据结构。以逗号分隔的字符串存储值是在关系数据库中存储值的错误方法。 –
这已经存在了,所以我不允许改变它 –
你有没有告诉他们他们的数据库设计存在严重缺陷,只会让他们在未来陷入更多麻烦?而现在你所能做的就是构建一个糟糕的解决方法,肯定会失败一天 – GuidoG