如何使sql join实现所需的结果?

时间:2012-09-21 18:53:56

标签: sql tsql join

我有2个选择正在返回:

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

到目前为止,我有两个简单的选择,左联接让我回复:

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

ObjectId  | ChildType2Id | ChildType2Field
   1             6           vbn 
   1             7           jkh

如果我有更多的孩子类型怎么办? 对于每个childType,我似乎需要使用union。如果我有50列,我需要在UNION中声明所有这些列(因为它需要相同数量的列)。 我可以避免使用像join这样的联盟来添加我需要的列(下一个childrentype列)吗?

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

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:5)

要做JOINUNIONSQL 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 

答案 1 :(得分:1)

这是一个UNION。

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;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我看不出你想要的是一个加入。这个联盟做到了这一点:

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