【问题标题】:Merge values in sql rows合并sql行中的值
【发布时间】:2014-03-20 10:06:35
【问题描述】:

我正在寻找将行值合并到要合并的列相同的一行的方法

变换:

FK | F1 
========
3  | ABC    
3  | DEF 

FK | F1    | F2
=================
3  | ABC   | DEF

更新: 我最初不知道 F1 的值。它们可能是一切,但我知道它们对于给定的 FK 是独一无二的,并且它们是 varchars。

更新 2: 在您的帮助下,我来到了这个查询,该查询还将添加只有一个值的 FK。我想它可以改进。

选择 IFNULL(jointable.FK,table.FK) AS FK, IFNULL(jointable.F1,table.F1),joinable.F2 来自table 左连接 (选择 T1.FK、T1.F1、T2.F1 作为 F2 来自tableT1 左连接 table T2 ON T1.FK = T2.FK 哪里 T1.F1 T2.F1 按 T​​1.FK 分组 ) 作为可连接的 开table.FK=jointable.FK 按 FK 分组;

【问题讨论】:

  • 你的数据库是哪个? Oracle、SQL server、MySql 等
  • 每个 ID 是否只有 2 行或更多?
  • Mysql是数据库。
  • 我每个 FK 有 1 或 2 个 F1

标签: mysql sql merge unpivot


【解决方案1】:

试试这个

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 是因为您提到您有 1 个或多个值,这意味着 INNER JOIN 最终可能会排除行。

第二个标准是确保您不会出现以下行:

FK | F1    | F2
=================
3  | ABC   | ABC

请注意,如果是 OUTER JOINLEFTRIGHT),连接条件与过滤条件不同,因此我将其移至上方。

在 SQL Server 中,您可以使用 ROW_NUMBER() 而不是 FK,也可以使用 ORDER BY

在 MySQL 中,您可能可以将它与 GROUP BY 一起使用,正如您在 cmets 中提到的那样,我不确定它是否会起作用(至少在没有聚合函数或 CTE 的 SQL Server 中不会)。

这是一个现场测试:http://ideone.com/Bu5aae

【讨论】:

  • 它有效,但它产生两行 - 第一个是“3 ABC DEF”,第二个是“3 DEF ABC”。我会尝试将它们分组以获得独特的
  • 我把它改成了“SELECT T1.FK, T2.F1, T1.F1 AS F2 FROM table T1 LEFT JOIN table T2 ON T1.FK = T2.FK WHERE T2.F1 T1.F1 GROUP BY FK”,它对我有用。谢谢
  • 是的,但我做了一个测试。如果 FK 只有一个值,则它被遗漏。你知道我怎么能把它添加到结果中。我可以为每个 FK 设置一个或两个值。当它只有一个时,我应该展示它。如果有两个我应该合并它们。
【解决方案2】:

一个建议:

SELECT FK, CONCAT(T1.F1,'',T2.F1) AS Result
FROM table T1, table T2
WHERE T1.FK = T2.FK

【讨论】:

  • 这给了我 3 ABCABC 3 ABCDEF 3 DEFABC 3 DEFDEF 等值。我想加入他们
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2021-06-14
  • 2013-01-12
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多