繁体   English   中英

如何使一个SQL联接达到预期的结果?

[英]How to make an sql join to achieve desired result?

我有两个选择返回:

SELECT_A (COLUMN_A,COLUMN_B, SELECT_A_JOIN_COLUMN)

SELECT_B (COLUMN_A,COLUMN_B, SELECT_B_JOIN_COLUMN)

所需结果:

Result  (COLUMN_A,COLUMN_B,SELECT_A_JOIN_COLUMN,SELECT_B_JOIN_COLUMN)

例:

SELECT_A结果:

A B zxc
A B rty

SELECT_B结果:

A B yui
A B hjk

预期结果:

A B zxc null
A B rty null
A B null yui
A B null hjk

如何实现呢?

这几乎就像是工会,但我可以通过加入来做到这一点吗?

编辑

好。 所以,让我说一下我的目标。 我想让查询返回一个层次树。 这是因为LINQ2Entities会生成额外的慢速和低效率的sql进行查询,其中包含许多导航属性。

所以我首先要实现的就是以某种方式得到这棵树。

例:

我想达到的结果是:

ObjectId | ChildType1Id | ChildType1Field | ChildType2Id | ChildType2Field

    1          34          asd          null        null
    1          12          xcv          null        null
    1          5           klk          null        null
    1          null        null         6           vbn
    1          null        null         7           jkh

到目前为止,我有2个带有左联接的简单选择返回我:

ObjectId  | ChildType1Id | ChildType1Field
    1          34             asd
    1          12             zcv
    1          5              klk

ObjectId  | ChildType2Id | ChildType2Field
   1             6           vbn 
   1             7           jkh

如果我将有更多的孩子类型怎么办? 对于每个childType,看来我确实需要使用联合。 如果我有50列,则需要在UNION中声明所有这些列(因为它需要相同数量的列)。 我是否可以避免仅通过添加所需列(下一个childtype列)之类的方式使所有这些并集成为联接?

3个不同子类型的期望结果

ObjectId|ChildType1Id|ChildType1Field|ChildType2Id|ChildType2Field|ChildType3Id|ChildType3Field

    1          34          asd          null        null       null         null 
    1          12          xcv          null        null       null         null
    1          5           klk          null        null       null         null
    1          null        null         6           vbn        null         null
    1          null        null         7           jkh        null         null
    1          null        null         null        null        5           iop
    1          null        null         null        null        9           klp

任何帮助表示赞赏。

作为一个JOIN来做比一个UNION更复杂( SQL Fiddle

SELECT COALESCE(A.COLUMN_A, B.COLUMN_A) AS COLUMN_A,
       COALESCE(A.COLUMN_B, B.COLUMN_B) AS COLUMN_B,
       SELECT_A_JOIN_COLUMN,
       SELECT_B_JOIN_COLUMN
FROM   SELECT_A A
       FULL OUTER JOIN SELECT_B B
         ON SELECT_A_JOIN_COLUMN = SELECT_B_JOIN_COLUMN 

这是一个联盟。

SELECT COLUMN_A, COLUMN_B, SELECT_A_JOIN_COLUMN, NULL
    FROM SELECT_A
UNION ALL
SELECT COLUMN_A, COLUMN_B, NULL, SELECT_B_JOIN_COLUMN
    FROM SELECT_B;
select COLUMN_A, COLUMN_B, SELECT_A_JOIN_COLUMN, null
from SELECT_A
union all
select COLUMN_A, COLUMN_B, null, SELECT_B_JOIN_COLUMN
from SELECT_B

我看不到您想要的加入方式。 该联合会这样做:

select *
from ((select COLUMN_A,COLUMN_B, SELECT_A_JOIN_COLUMN, NULL as SELECT_B_JOIN_COLUMN
       from SELECT_A
      ) union all
      (select COLUMN_A,COLUMN_B, NULL as SELECT_A_JOIN_COLUMN, SELECT_B_JOIN_COLUMN
       from SELECT_B
      )
     ) t
order by 1, 2, 3, 4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM