在单个查询中获取多个 SQL 表的列

Posted

技术标签:

【中文标题】在单个查询中获取多个 SQL 表的列【英文标题】:Getting columns of multiple SQL tables in a single query 【发布时间】:2013-10-17 13:32:19 【问题描述】:

我想在单个查询中获取与文档相关的所有元数据值,无论是在某些列中为 null。

例子:

DOCUMENT table     ATTRIBUTE_1 values    ATTRIBUTE_2 values

Id | Name          DocId | Value         DocId | Value
-----------        ---------------       ---------------
1  | Doc1          1     | Val1          1     | ValA
2  | Doc2          1     | Val2          1     | ValB
                                         1     | ValC

对于 Doc1,我希望查询返回按字母顺序排列的每个属性的值:

Attr1     | Attr2
--------------------
Val1      | ValA
Val2      | ValB
NULL      | ValC

我尝试了一个非常幼稚的查询:

SELECT a1.Value, a2.Value FROM ATTRIBUTE_1 a1, ATTRIBUTE_2 a2, DOCUMENT d 
WHERE d.Id = a1.DocId AND d.Id = a2.DocId AND d.Id = 1

我尝试进行内部连接,我尝试使用谷歌搜索,但找不到与将多个列合并为一个的术语。

使用的数据库是Oracle。

我怎样才能实现这个目标?

谢谢

【问题讨论】:

“属性”是如何排序的?换句话说,为什么你期望结果中的第三行是NULL | ValC Val1Val2 之间有什么联系,所以它们必须并排出现? (结果中的所有对也是如此) @Colin'tHart 我添加了一些关于我尝试过的细节。排序应该按字母顺序然后NULL。 @geomagas 你的意思是Val1ValA?如果是,则只需按字母顺序对列进行排序。 我希望Val1, Val2, ... 只是示例,因为Val10 将排在Val9 之前。 @Colin'tHart 是的,这些只是愚蠢的例子,因为我无权将真正的价值观发送到公司之外。 【参考方案1】:

这对我有用:

with a1 as (
   select
     row_number() over (partition by DocId order by Value) as r,
     DocId,
     value
   from
     ATTRIBUTE_1
), a2 as (
   select
     row_number() over (partition by DocId order by Value) as r,
     DocId,
     value
   from
     ATTRIBUTE_2
)
select a1.Value as Attr1, a2.Value as Attr2
from a1 full outer join a2 using (DocId, r) join DOCUMENT on (DocId = Id);

查看这个 SQL Fiddle:http://sqlfiddle.com/#!4/a3526/3/0

【讨论】:

以上是关于在单个查询中获取多个 SQL 表的列的主要内容,如果未能解决你的问题,请参考以下文章

单个SQL查询,用于更新多个字段值

SQL 语句从右表的多行中获取单个值作为输出中的列

在 Access 中有多个列的查询中选择单个不同的列

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

从提取多个值的列中查询单个值

如何使用单个查询获取存储在不同变量中的多个表行的计数?