联合两个查询结果按列

Posted

技术标签:

【中文标题】联合两个查询结果按列【英文标题】:Union two query result column-wise 【发布时间】:2021-03-27 17:40:18 【问题描述】:

假设我有两个查询返回两个具有相同行数的表。 例如,如果查询 1 返回

| a | b | c |
| 1 | 2 | 3 |
| 4 | 5 | 6 |

查询 2 返回

| d  | e  | f  |
| 7  | 8  | 9  |
| 10 | 11 | 12 |

如何获得以下内容,假设两个查询都是不透明的

| a | b | c | d  | e  | f  |
| 1 | 2 | 3 | 7  | 8  | 9  |
| 4 | 5 | 6 | 10 | 11 | 12 |

我目前的解决方案是为每个查询添加一个行号列并内部连接它们 在这个专栏上。

SELECT
    q1_with_rownum.*,
    q2_with_rownum.*
FROM (
    SELECT ROW_NUMBER() OVER () AS q1_rownum, q1.*
    FROM (.......) q1
) q1_with_rownum
INNER JOIN (
    SELECT ROW_NUMBER() OVER () AS q2_rownum, q2.*
    FROM (.......) q2
) q2_with_rownum
ON q1_rownum = q2_rownum

但是,如果在任一查询中有名为 q1_rownum 的列, 以上将打破。我无法查看q1q2; 唯一可用的信息是它们都是有效的 SQL 查询 并且不包含具有相同名称的列。是否有任何 SQL 构造 类似于 UNION 但用于列而不是行?

【问题讨论】:

【参考方案1】:

没有这样的功能。表中的是一个实体。

如果您正在构建在任何表上运行的通用代码,您可以尝试使用不太常见的值,例如"an unusual query rownum"——或者比这更深奥的东西。我建议在两个表中使用相同的名称,然后对 join 使用 using 子句。

【讨论】:

【参考方案2】:

不确定我是否理解您的确切问题,但我认为您的意思是 q1 和 q2 都连接在同名的列上?

您应该在列之前添加每个表名,以区分引用的是哪一列: "table1"."similarColumnName" = "table2"."similarColumnName"

编辑: 所以,问题是如果已经有一个与您的 ROW_NUMBER() 具有相同别名的列,则无法进行 JOIN,因为您的列名不明确。

如果您不知道传入表的列,更简单的解决方案是创建一个可靠的别名,例如_query_join_row_number

编辑2: 您可以查看为所有列添加其原始表名称的前缀,从而消除任何冲突(您会得到 q1_with_rows.rows 并且冲突列是 q1_with_rows.q1.rows) 关于此的示例堆栈:In a join, how to prefix all column names with the table it came from

【讨论】:

此外,如果任一查询都没有 id,请确保您的行与您想要的 ORDER BY 匹配。如果像“client1”和“client2”这样的每一行都有意义,那么他们应该对“a”和“f”列有自己的结果,不要混淆 我无法查看任何一个查询,因为它们是用户输入的 SQL 字符串,所以我不知道“table1”实际上有哪些列......如果“table1”已经有一个名为“rownum”的列将与我的SELECT ROW_NUMBER() OVER () AS rownum 发生冲突 不敢相信我忘记了,但 Gordon Linoff 说对了。 USING (column)ON table1.column = table2.column 的快捷方式。 啊,你的问题与JOIN无关,而是别名是否可以使用。我认为生成的默认名称无论如何都是row_number,就用那个? 基本上,我有两个行数相等的表(以及所有不同的列名)。我想制作第三个表,其中包含两个表中的列。我不可能知道每个表实际上有哪些列,所以没有SELECT q1.col_1, q1.col_2 等。

以上是关于联合两个查询结果按列的主要内容,如果未能解决你的问题,请参考以下文章

SqlSever基础 union all 联合查询,简单的组合 两个查询结果拼在一起

按列值查询某些行的联合和分组

LINQ的问题,两个表联合查询

SqlSever基础 union 联合查询,厉害的并集 重复项只显示一个 两个查询结果并在一起后排序

sql联合查询UNION问题

pandas实现两个dataframe数据的合并:按行和按列