2017-05-24 68 views
-2

,如果我有這樣的表SQL - 如何找到所有相同的數值列

Value1  Value2  
     1   A  
     1   B  
     2   A  
     2   B  
     2   C  
     3   A  
     3   B 
     4   A 
     4   C 
     5   B 
     5   A 
     6   C 
     7   B 
     8   B 
     9   A 

我想只返回具有相同值2(但不是更多,而不是左)值1。例如,結果必須具備:

Value1   Result 
    1    3,5 
    2    NULL 
    3    1,5 
    4    NULL 
    5    1,3 
    6    NULL 
    7    8 
    8    7 
    9    NULL 

我試着使用DISTINCT和INNER JOIN一些功能,但我找不到任何解決辦法。有人可以幫我理解怎麼做?

+2

MySQL或SQL服務器? – TriV

+0

「只有Value1具有相同的Value2」是什麼意思? – Sami

+1

顯示你到目前爲止嘗試過的嗎?並澄清你有什麼RDBMS,這將決定最佳答案。 –

回答

1

使用STUFF的方法。你可以結合Value2每個value1並比較它們。

DECLARE @SampleData AS TABLE 
(
    Value1 int, 
    Value2 varchar(20) 
) 

INSERT INTO @SampleData 
VALUES 
(1, 'A'),  
(1, 'B'),  
(2, 'A'),  
(2, 'B'),  
(2, 'C'),  
(3, 'A'),  
(3, 'B'), 
(4, 'A'), 
(4, 'C'), 
(5, 'B'), 
(5, 'A'), 
(6, 'C'), 
(7, 'B'), 
(8, 'B'), 
(9, 'A') 

;WITH temp AS 
(
    SELECT sd.Value1, 
     stuff(( SELECT ','+ sd2.Value2 
       FROM @SampleData sd2 
       WHERE sd2.Value1 = sd.Value1  
       ORDER BY sd2.Value2 -- Value2 must be ordered to compare exactly. 
       FOR XML PATH('') 
      ) 
        ,1,1,'') as Value2 
    FROM 
    (
     SELECT DISTINCT sd.Value1 
     FROM @SampleData sd 
    ) sd 
) 
SELECT t.Value1, STUFF((
         SELECT ',' + CAST(t2.Value1 AS varchar(10)) 
         FROM temp t2 
         WHERE  t2.Value2 = t.Value2 
          AND t2.Value1 != t.Value1 
         ORDER BY t2.Value1      
         FOR XML PATH ('') 
        ) 
        ,1,1,'') as Value2 
FROM temp t 

演示鏈接:http://rextester.com/CMUHA74596

+0

你是最棒的。真的非常感謝你,很容易理解,並且完美地工作。 – Vladmyr

+0

樂意幫忙@Vladmyr – TriV

0

您可以在sql語句中使用where子句來指定僅選擇具有相同值Value1和Value2的行。

使用下面的SQL語句:

SELECT Value1 FROM table WHERE Value1 = Value2 
+0

對不起,我的意思,我會改變例子 – Vladmyr

0

我不會寫吧,但是這可能會引導你走向一個解決方案。

您需要使用FULL OUTER JOIN編寫函數。在Value1<>Value1上加入表格以將您正在測試的Value1與其他所有人進行比較。對於每個Value1配對,當FULL OUTER JOIN的任何一邊爲NULL時,則表示沒有匹配。當JOIN任一側沒有NULLS進行配對時,則它們完全匹配。

相關問題