Sql 是否编写查询以显示以下结果?
共有3个表格: 表A:Sql 是否编写查询以显示以下结果?,sql,sql-server,Sql,Sql Server,共有3个表格: 表A: code aname ------- --------- 1 A 2 B 3 C 表B: code bname ----------- ---------- 1 aaa 1 bbb 2 ccc 2 ddd 表C: code cname ----------- ---------- 1 xxx 1
code aname
------- ---------
1 A
2 B
3 C
表B:
code bname
----------- ----------
1 aaa
1 bbb
2 ccc
2 ddd
表C:
code cname
----------- ----------
1 xxx
1 yyy
1 zzz
2 www
我们需要编写一个显示以下结果的查询:
code aname bname cname
----------- ---------- ---------- ----------
1 A aaa xxx
1 A bbb yyy
1 A NULL zzz
2 B ccc www
2 B ddd NULL
3 C NULL NULL
您需要建立一个
TableB
和TableC
的排序列,因为它们的数量似乎很重要。我将使用,这是由许多系统支持的,但您可以做子查询
with tbb as (
select
*
,row_number() over (partition by code order by bname) nameorder
from
TableB
), tbc as (
select
*
,row_number() over (partition by code order by cname) nameorder
form
TableC
), mrg as (
select
coalesce(tbb.code, tbc.code) code
,bname
,cname
from
tbb
full outer join tbc on
tba.code = tbb.code
and tba.nameorder = tbb.nameorder
)
select
tba.code
,aname
,bname
,cname
from
TableA tba
left outer join mrg on tba.code = mrg.code
您没有完整的
join
键,因为您希望在每列中都有列表。要实现这一点,您需要使用完全外部联接
,并生成排序键。注:每列中的最终顺序是任意的
select coalesce(a.code, b.code, c.code) as code,
a.aname, b.bname, c.cname
from (select a.*, row_number() over (partition by code order by code) as seqnum
from a
) a full outer join
(select b.*, row_number() over (partition by code order by code) as seqnum
from b
) b
on a.code = b.code and a.seqnum = b.seqnum full outer join
(select c.*, row_number() over (partition by code order by code) as seqnum
from c
) c
on c.code in (a.code, b.code) and c.seqnum in (a.seqnum, b.seqnum)
到目前为止你试过什么?显示您当前的查询并告诉我们有什么问题!执行a
LET JOIN
b/w所有表。您使用的是什么数据库?@GordonLinoff,由于OP的标记选择SQL
和Server
:)感谢上面的查询,我强烈假设它的SQL Server
:)我曾尝试在所有表上进行左连接,但没有显示空值,也尝试过进行所有可能的连接和分组,但仍然被卡住。感谢帮助。虽然这是一个函数式查询,我怀疑OP会理解它,当看到他的问题时,我真的会问他“你到底想做什么…?”如果你想做SQL谜语、学生考试或理论研究,像这样的查询很有趣。但在我看来,OP想要做一些非常简单的事情,因此我们应该问他到底想做什么。我相信他真正需要的解决方案要简单得多……顺便说一句,这就是程序员和软件工程师的区别:程序员从客户那里得到一个问题,并且完全按照客户说的去做。没有问题。即使解决方案非常复杂。他假设客户是IT专家。软件工程师更进一步,问自己“客户到底想要什么?”——然后与客户交谈,试图理解他,然后找到一个可靠而简单的解决方案。@SQLPolice。再一次,我不知道你对一个正确回答老年退休金问题的答案有什么异议,这个答案是标准SQL。你应该把你的批评保留在另一个论坛上,那更适合于这样的评论。虽然我很欣赏你的SQL知识,这真的很棒,非常有用,但我们应该质疑人们到底想用他们的解决方案做什么。好的,计算机科学是一种乐趣,但大多数情况下,软件用于某些解决方案。这个案例就是一个例子,我确信应该对最初的问题进行审查。IMHO,这比迷惑一个OP可能根本无法理解的复杂查询要有用得多。此外,您的查询将只处理OP提供的样本数据。如果有不同代码和不同间隙的数据,那么它将失败。我现在没有时间,但我会在周五证明这一点。