2016-09-26 162 views
-1

存在的列值比方说,我有SQL服务器:逗号分隔的其他逗号分隔栏

OrgData 
OrgDataid columvalues 
1   1,2,3,4,5 
2   6,7,8,9 
3   16,17,18,19 

另一个表保存选定值

selectedData 
rowid sid orgid values 
1  1  1  1,2 
2  1  2  6,7,8,9 
3  2  1  1,2,3,4,5 

其中SID是OrgData

的id

我想输出像

为sid 1;

outputData 
OrgData columvalues 
1   partial selected 
2   Full selected 
3   Nothing selected 

我想要一些直接查询,而我试图做到这一点,分割每个逗号分隔行和循环为每一个。

谢谢

+3

修复你的数据结构。以逗号分隔的字符串存储值是在关系数据库中存储值的错误方法。 –

+0

这已经存在了,所以我不允许改变它 –

+1

你有没有告诉他们他们的数据库设计存在严重缺陷,只会让他们在未来陷入更多麻烦?而现在你所能做的就是构建一个糟糕的解决方法,肯定会失败一天 – GuidoG

回答

1

你可以试试这个:

- 模拟式桌与您的数据

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   | 
+-----------+------------+-------+------------+ 
0

尝试下面的脚本,可能会帮助你。但我同意@Gordon Linoff, 修复你的数据结构。以逗号分隔的字符串存储值是错误的方法。

SELECT OrgDataid 
     ,(CASE WHEN OD.columvalues = SD.[values] THEN 'Full selected' 
       WHEN SD.rowid IS NULL THEN 'Nothing selected' 
     ELSE 'partial selected' END) AS columvalues 
FROM OrgData AS OD 
LEFT OUTER JOIN selectedData AS SD ON OD.columvalues LIKE '%'+SD.[values]+'%' 
+0

它不能确定连续值将被选中,它可以选择任何值 –