外部联接/联合?-t/sql查询

外部联接/联合?-t/sql查询,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我需要一个复杂的t/sql查询来帮助我编写一个特殊的报告。 我不太知道如何表达这个问题;但我要试一试: 基本上,我有以下三个表格: @PrimaryTable Key - Is unique and may or may not exist Description1 - Some field Description2 - Some field which works as a heading, more on this later @Subtable1 KeyFK - is

我需要一个复杂的t/sql查询来帮助我编写一个特殊的报告。 我不太知道如何表达这个问题;但我要试一试:

基本上,我有以下三个表格:

@PrimaryTable
  Key - Is unique and may or may not exist
  Description1 - Some field 
  Description2 - Some field which works as a heading, more on this later

@Subtable1
  KeyFK - is NOT unique, links to Key in primary table. May or may not exist. May also exist multiple times per Key
  Description - The field I want

@Subtable2 
 - Just like subtable1, but does not relate to subtable1 in any way
我想将这些表连接到PrimaryTable,因为它看起来有一个UNION ALL,但没有所有的空值

有关示例,请参见此查询:

DECLARE @PrimaryTable AS table ("Key" int, Description1 varchar(32), Description2 varchar(32));        --Contains MAXIMUM one of each Key
DECLARE @Subtable_1 AS table ("KeyPK" int, SubDescription1 varchar(32));    --Can contain zero, one or more lines with same KeyPK
DECLARE @Subtable_2 AS table ("KeyPK" int, SubDescription2 varchar(32));    --Can contain zero, one or more lines with same KeyPK

INSERT INTO @PrimaryTable VALUES (1, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (2, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (3, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (5, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (6, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (7, 'Description', 'Heading');
INSERT INTO @PrimaryTable VALUES (8, 'Description', 'Heading');

INSERT INTO @Subtable_1 VALUES (1, 'Subdescription1_1');

INSERT INTO @Subtable_2 VALUES (2, 'Subdescription2_1');

INSERT INTO @Subtable_1 VALUES (3, 'Subdescription1_1');
INSERT INTO @Subtable_2 VALUES (3, 'Subdescription2_1');

INSERT INTO @Subtable_1 VALUES (4, 'Subdescription1_1');
INSERT INTO @Subtable_2 VALUES (4, 'Subdescription2_1');
INSERT INTO @Subtable_2 VALUES (4, 'Subdescription2_2');

INSERT INTO @Subtable_1 VALUES (5, 'Subdescription1_1');
INSERT INTO @Subtable_1 VALUES (5, 'Subdescription1_2');
INSERT INTO @Subtable_2 VALUES (5, 'Subdescription2_1');

INSERT INTO @Subtable_1 VALUES (6, 'Subdescription1_1');
INSERT INTO @Subtable_2 VALUES (6, 'Subdescription2_1');
INSERT INTO @Subtable_2 VALUES (6, 'Subdescription2_2');

INSERT INTO @Subtable_1 VALUES (7, 'Subdescription1_1');
INSERT INTO @Subtable_1 VALUES (7, 'Subdescription1_2');
我希望结果如下所示:

/*
Key Description1    Description2    Subdescription1     Subdescription2
_________________________________________________________________________
1   Description     Heading         ''                  ''
1   Description     ''              Subdescription1_1   NULL

2   Description     Heading         ''                  ''
2   Description     ''              NULL                Subdescription2_1

3   Description     Heading         ''                  ''
3   Description     ''              Subdescription1_1   Subdescription2_1

5   Description     Heading         ''                  ''
5   Description     ''              Subdescription1_1   Subdescription2_1
5   Description     ''              Subdescription1_2   NULL

6   Description     Heading         ''                  ''
6   Description     ''              Subdescription1_1   Subdescription2_1
6   Description     ''              NULL                Subdescription2_2

7   Description     Heading         ''                  ''
7   Description     ''              Subdescription1_1   NULL
7   Description     ''              Subdescription1_2   NULL

8   Description     Heading         ''                  ''
*/
说明为空的标题行没有问题;可以很容易地完成使用工会后,但我不知道如何加入这些表像这样-有人知道如何可以做到这一点

编辑: 我应该从一开始就解释报告: 我正在开发一个非常好的数据库结构,但我有一个非常奇怪的报告要求

PrimaryTable是报表所要求的实际表 Subtable1是解释主表不同部分的表,这是真实信息。 Subtable2不是一个表,而是一个协定(PrimaryTable中的一个字段),分解为一行

然后,报告希望主表中的所有信息作为标题,包括一些小计。然后有一个向下折叠选项,打开到合同中的一行pr.subtable2 description/行。pr Key的行数仅显示每个向下折叠的长度

SQL将尽可能多地完成报告应答时间。-这将是一个存储过程,它将生成一个基于表的快速回答解决方案

我想您需要这样的内容:

SELECT key, description1, description2, '', ''
FROM PrimaryTable
UNION
SELECT distinct p.description1, '', s1.subdescription1, s2.subdescription2
FROM PrimaryTable as p
LEFT JOIN Subtable1 as s1
ON p.key = s1.key
LEFT JOIN Subtable2 as s2
ON p.key = s2.key

我还要说,看起来您有一个非常奇怪的数据库结构。您有两个“subdescription”表吗?

这接近您的预期结果(在Key=6和Key=8的情况下进行双重检查):


哇,谢谢你,这基本上正是我想要的;不知怎的,我没有想到“与众不同”这个词。。。我正在研究的数据库结构实际上相当好,这是一份没有意义的报告。我应该从一开始就解释这份报告;问题现在将被更新。编辑:我刚刚校对了这些查询,但这一个仍然给了我相同的错误,请参见key=5和key=6,我需要NULL,而不是“Subdescription2\u 1”和“Subdescription1\u 2”,这两个都很有趣。您能解释一下您用来确定键
5
必须返回
子描述1\u 2-NULL
的逻辑吗?对不起;我再一次不清楚,子描述2:返回NULL而不是子描述2_2,其中Key=5子描述1:返回NULL而不是子描述1_2,其中Key=6此字段应返回NULL的原因是:当Key=5时,子表1中有两行,子表2中有一行因此结果中Key=5的行数为3(2[行数越大]+带标题的行数),在找到这一行数后,它应该只添加子表中的每个信息一次;例如,返回原始问题中显示的值。第一个选项应为空列分配别名,第二个选项缺少
列,并且
列应处处分隔。除此之外,这必须正常工作,除非两个子表对于相同的
键有多个项(您将获得重复项)。
SELECT "Key", 
       P1.Description1, '' AS Description2, 
       S1.SubDescription1, S2.SubDescription2
  FROM @PrimaryTable AS P1
       LEFT OUTER JOIN @Subtable_1 AS S1
          ON P1."Key" = S1."KeyPK"
       LEFT OUTER JOIN @Subtable_2 AS S2
          ON P1."Key" = S2."KeyPK"
UNION
SELECT "Key", 
       P1.Description1, P1.Description2, 
       '' AS SubDescription1, '' AS SubDescription2
  FROM @PrimaryTable AS P1
 ORDER 
    BY "Key", Description2 DESC;