我正在寻找将行值合并到一行中的方法,其中要合并的列是相同的
变换:
FK | F1
========
3 | ABC
3 | DEF
到
FK | F1 | F2
=================
3 | ABC | DEF
更新: 我最初不知道F1的价值观。它们可能就是一切,但我知道它们对于给定的FK是唯一的,它们是变量。
更新2: 在你的帮助下,我来到这个查询,它还将添加只有一个值的FK。我想它可以改进。
SELECT IFNULL(jointable.FK,table
。FK)AS FK,IFNULL(jointable.F1,table
。F1),jointable.F2
来自table
LEFT JOIN
(选择T1.FK,T1.F1,T2.F1 AS F2
来自table
T1
LEFT JOIN table
T2 ON T1.FK = T2.FK
在哪里T1.F1<> T2.F1
GROUP BY T1.FK
)作为连接表
ON table
。FK = jointable.FK
GROUP BY FK;
答案 0 :(得分:2)
试试这个
SELECT FK
, T1.F1
, T2.F1 AS F2
FROM table T1
LEFT JOIN table T2 ON T1.FK = T2.FK AND T1.F1 <> T2.F1 --Criteria moved here
使用了LEFT JOIN
,因为您提到您有一个或多个值,这意味着INNER JOIN
可能最终排除了行。
第二个标准是确保您不会使用以下行:
FK | F1 | F2
=================
3 | ABC | ABC
请注意,如果是OUTER JOIN
(LEFT
或RIGHT
),则加入条件与过滤条件不同,因此我将其移至上方。< / p>
在SQL Server中,您可以使用ROW_NUMBER()
而不是FK
,也许使用ORDER BY
。
在MySQL中,您可以将其与GROUP BY
一起使用,如您在评论中提到的那样,我不确定它是否可行(至少在没有聚合函数或CTE的情况下不在SQL Server中)。
这是一个实时测试:http://ideone.com/Bu5aae
答案 1 :(得分:0)
建议:
SELECT FK, CONCAT(T1.F1,'',T2.F1) AS Result
FROM table T1, table T2
WHERE T1.FK = T2.FK