簡體   English   中英

SQL Server中的逗號分隔操作

[英]Comma-separated operation in SQL Server

表1

T1Id      Name    SchoolIds
------------------------------
01        A       1,2,3,4
02        B       4,20,3,1
03        C       20,30,40
04        D       30,20,10,2

表2

T2ID        SchoolIds       Username
--------------------------------------
01          1,2,3,4         a@a.com
02          20,30,40,2      b@a.com
03          30,20,10,2      c@a.com
04          4,20,3,1        d@a.com

有兩個頁面,一個是登錄頁面,另一個是記錄頁面。

當某人使用username='a@a.com'登錄並進行記錄時,該代碼應僅顯示Table1中的那些行與Table1 1中SchoolIds列的匹配項。

如果使用a@a.com登錄,則期望的結果將是:

T1Id      Name     SchoolIds
-----------------------------
01        A        1,2,3,4
02        B        4,20,3,1
04        D        30,20,10,2

首先,不要將項目存儲為逗號分隔的字符串。

相反,請轉到一個新表,該表具有附加到父表的外鍵。 這也將使您輕松獲得所需的數據。

所以我的建議是創建一個新表並將每個項目存儲為單獨的行,並與父表匹配一些ID :)

看起來很大,但是卻能提供您想要的東西。 有任何建議,請在評論中注明。

DECLARE @Table1 TABLE(T1ID INT, Name VARCHAR(1), SchoolIds VARCHAR(20))
INSERT INTO @Table1 VALUES(01,'A','1,2,3,4')
INSERT INTO @Table1 VALUES(02,'B','4,20,3,1')
INSERT INTO @Table1 VALUES(03,'C','20,30,40')
INSERT INTO @Table1 VALUES(04,'D','30,20,10,2')

DECLARE @Table2 TABLE(T2ID INT, SchoolIds VARCHAR(20), Username VARCHAR(20))
INSERT INTO @Table2 VALUES(01,'1,2,3,4','a@a.com')
INSERT INTO @Table2 VALUES(02,'20,30,40,2','b@a.com')
INSERT INTO @Table2 VALUES(03,'30,20,10,2','c@a.com')
INSERT INTO @Table2 VALUES(04,'4,20,3,1','d@a.com')


SELECT A.T1ID,Name,
     Split.a.value('.', 'VARCHAR(100)') AS [SchoolId]  
INTO #T1Vals
 FROM  
 (
     SELECT T1ID,Name,
         CAST ('<M>' + REPLACE(SchoolIds, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  @Table1
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);

SELECT A.T2ID,Username,
     Split.a.value('.', 'VARCHAR(100)') AS [SchoolId]  
INTO #T2Vals
 FROM  
 (
     SELECT T2ID, Username,
         CAST ('<M>' + REPLACE(SchoolIds, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  @Table2
     WHERE Username='a@a.com'
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);

 SELECT * 
 FROM @Table1 
 WHERE T1ID IN(
    SELECT T1ID 
    FROM #T1Vals 
    WHERE [SchoolId] IN(SELECT [SchoolId] FROM #T2Vals))

 DROP TABLE #T1Vals
 DROP TABLE #T2Vals

輸出:

T1ID    Name    SchoolIds
1       A       1,2,3,4
2       B       4,20,3,1
4       D       30,20,10,2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM