Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否编写查询以显示以下结果?_Sql_Sql Server - Fatal编程技术网

Sql 是否编写查询以显示以下结果?

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

共有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           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提供的样本数据。如果有不同代码和不同间隙的数据,那么它将失败。我现在没有时间,但我会在周五证明这一点。