2016-09-26 211 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

它不能確定連續值將被選中,它可以選擇任何值 –