2017-05-24 73 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进行配对时,则它们完全匹配。

相关问题