2017-01-27 104 views
0

我的表“详细信息”看起来像这样,SQL查询返回其在同一行的另一列相同ID的列的不同值

ID Name City 
1  Arun Chennai 
2  Arun Mumbai 
3  Raj  Bangalore 
4  Raj  Chennai 

我要选择在“城市包含不同的值相同的名称'列在一行中。

我已经写了下面的查询

select a.id, b.id, a.Name, a.city, b.city 
from Details a join Details b on a.Name = b.Name 
where a.City <> b.City 

对于其输出是

id id Name City  City 
1 2 Arun Chennai Mumbai 
2 1 Arun Mumbai Chennai 
3 4 Raj Bangalore Chennai 
4 3 Raj Chennai Bangalore 

但我需要在一排的输出与这两个ID和市

id id Name City  City 
1 2 Arun Chennai Mumbai 
3 4 Raj Bangalore Chennai 

请建议

+1

您使用哪种RDBMS?只标记一个! –

回答

0

试试这个:

select a.id, b.id, a.Name, a.city, b.city 
from Details a 
inner join Details b on a.Name = b.Name and a.id < b.id 

注:这只要你总是有两个记录每Name工作。如果你有任何一个,或者两个记录,那么你可以使用LEFT JOIN而不是INNER JOIN

编辑:如果你可以为每个Name一个,两个或三个记录,然后将查询可以归结为如下:

select a.id, b.id, a.Name, a.city, b.city 
from Details a 
left join Details b on a.Name = b.Name and a.id < b.id 
left join Details c on a.Name = c.Name and b.id < c.id 

注:如果记录的数量是动态变化的,然后你必须使用某种与字符串连接,在MySQL中使用的GROUP_CONCAT等效分组。

+0

@Lakshman请检查我所做的编辑。 –

+0

谢谢@Giorgos – Lakshman

0

我不知道为什么你需要的ID &城市多列在同一组。

但是,这可能会帮助你(假定RDBMS:SQL Server)的

SELECT NAME, STUFF((
      SELECT ',' + City 
      FROM #DETAILS D2 
      WHERE D1.NAME = D2.NAME 
      FOR XML PATH('') 
      ), 1, 1, '') as Cities 
FROM #DETAILS D1 
GROUP BY NAME 

这会给你的结果一样

+------+-------------------+ 
| Name |  Cities  | 
+------+-------------------+ 
| Arun | Chennai,Mumbai | 
| Raj | Bangalore,Chennai | 
+------+-------------------+ 
0

您可以取代你的表名。这里我使用了内连接。

SELECT T1.ID,T2.ID,T1.Name,T1.City,T2.City 
FROM your_table T1 
INNER JOIN your_table T2 
ON T1.ID < t2.ID 
WHERE T1.Name = T2.Name 
相关问题