SQL Query在同一行的另一列中返回具有相同id的列的不同值

时间:2017-01-27 06:33:59

标签: oracle

我的表'详情'看起来像这样,

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 Name City      City
1  2  Arun Chennai   Mumbai
3  4  Raj  Bangalore Chennai

但我需要输出一行同时包含id和City的

$count = 1;
foreach ($DefaultSizes as &$def)
{
    if(in_array($def['Size'],$ExistingSizes) === false)
    {
        echo "$def[Size]<br>";
        $count++;
    }
}

请建议

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

但这可能会对你有所帮助(假设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 |
+------+-------------------+

答案 2 :(得分: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