【问题标题】:Outer Join / Union ?- t/sql query外部联接/联合?- t/sql 查询
【发布时间】:2012-03-31 01:01:40
【问题描述】:

对于我正在编写的特殊报告,我需要有关复杂 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 一样,但没有所有 NULL 值。

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

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 不是表,而是分解为一行 pr 的合同(PrimaryTable 中的一个字段)。行。

然后,报表希望主表中的所有信息作为标题,包括一些小计。然后有一个折叠选项,它打开到一排公关。 subtable2 描述/合同中的行。 pr Key 的行数简单地显示了每个折叠的长度。

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

【问题讨论】:

    标签: sql sql-server tsql join


    【解决方案1】:

    我认为你想要这样的东西:

    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
    

    我还要说,您的数据库结构看起来很奇怪。你有两个“子描述”表有什么原因吗?

    【讨论】:

    • 哇,谢谢,这基本上正是我想要的;不知何故,我没有想到不同的词……我正在研究的数据库结构实际上非常好,它是没有意义的报告。我应该从一开始就解释报告;问题将立即更新。
    • 编辑:我刚刚校对了查询,这仍然给了我同样的错误,请参阅 key = 5 和 key = 6,我需要 NULL 而不是 'Subdescription2_1' 和 'Subdescription1_2'
    • 有趣。您能否解释一下您用于确定必须为键 5 返回 Subdescription1_2 - NULL 的逻辑?
    • 对不起;再次我不清楚,subdescription2:返回NULL而不是Subdescription 2_2 WHERE Key = 5 Subdescription1:返回NULL而不是o Subdescription 1_2 WHERE Key = 6 这个字段应该返回NULL的原因是因为:当key = 5时,有两个Subtable1 中的行数,Subtable2 中的行数因此结果中 Key = 5 的行数为 3(2[较高的行数] + 带标题的行数)找到此行数后,应该只添加子表中的每个信息一次;例如。返回原始问题中结果显示的值。
    • 第一个 SELECT 应该为空列分配别名,第二个 SELECT 缺少 key 列,key 列应该在任何地方分隔。除此之外,这必须正常工作,除非两个子表对于同一个 key 有多个项目(然后你会得到重复)。
    【解决方案2】:

    这接近您的预期结果(仔细检查 Key = 6 和 8 的位置):

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多