在单个查询中获取多个 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
?
Val1
和 Val2
之间有什么联系,所以它们必须并排出现? (结果中的所有对也是如此)
@Colin'tHart 我添加了一些关于我尝试过的细节。排序应该按字母顺序然后NULL
。 @geomagas 你的意思是Val1
和ValA
?如果是,则只需按字母顺序对列进行排序。
我希望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 表的列的主要内容,如果未能解决你的问题,请参考以下文章