假设我有两个查询返回两个行数相同的表。 例如,如果查询 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
的列,
以上将打破。我无法查看 q1
或 q2
;
唯一可用的信息是它们都是有效的 SQL 查询
并且不包含具有相同名称的列。是否有任何 SQL 构造
类似于 UNION
但用于列而不是行?
答案 0 :(得分:2)
没有这个功能。表中的行是一个实体。
如果您正在构建通用代码以在任何表上运行,您可以尝试使用不太常见的值,例如 "an unusual query rownum"
-- 或者比这更深奥的东西。我建议在两个表中使用相同的名称,然后对 using
使用 join
子句。
答案 1 :(得分:1)
不确定我是否理解您的确切问题,但我认为您的意思是 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