1

このようなクエリに結合句があります。

SELECT Table1.Number

FROM Table1

JOIN Table2 AS Table on Table2.Table1_ID = Table1.ID
JOIN Table3 AS Table on Table3.Table1_ID = Table1.ID

JOIN OtherTable on Table.ID = OtherTable.Table_ID

Table.Number に応じてテーブル 2 または 3 の 1 つだけを条件付きで結合し、エイリアス名を保持して、他のテーブルが結合されるようにしたいと考えています。

4

3 に答える 3

1
select T1.*, OT.*
from Table1 as T1
    inner join (
        select 1 as Number, T.Col, T.Table1_ID, T.Table_ID from Table2
        union all
        select 2 as Number, T.Col, T.Table1_ID, T.Table_ID from Table3
    ) as T2 on T2.Number = T1.Number and T2.Table1_ID = T1.ID
    inner join OtherTable as OT on OT.Table_ID = T2.Table_ID

または(効率が悪い可能性があります)

select T1.*, OT.*
from Table1 as T1
    left outer join Table2 as TMP1 on TMP1.Table1_ID = T1.ID and T1.Number = 1
    left outer join Table3 as TMP2 on TMP2.Table1_ID = T1.ID and T1.Number = 2
    cross apply (select isnull(TMP1.Table_ID, TMP2.Table_ID) as Table_ID) as T2
    inner join OtherTable as OT on OT.Table_ID = T2.Table_ID
于 2013-07-31T21:30:08.460 に答える
0

これは、2 つのテーブルに同じ列 (または少なくとも共通の列サブセット) がある場合にのみ機能します。

SELECT Table1.Number,Table.Id,OtherTable.Id
FROM Table1
CROSS APPLY(
  SELECT col1,col2,col3 FROM Table2
  WHERE Table2.Table1_Id = Table1.Id
  UNION ALL
  SELECT col1,col2,col3 FROM Table3
  WHERE Table3.Table1_Id = Table1.Id
) AS Table
JOIN OtherTable 
ON Table.ID = OtherTable.Table_ID;
于 2013-07-31T21:15:24.323 に答える
0

2 つのテーブルを結合して 1 つの派生テーブルにすることで、これをだますことができます。

SELECT Table1.Number
FROM Table1 t1
INNER JOIN 
  (SELECT ID, Table1_ID FROM TABLE2
  UNION ALL
  SELECT ID, Table1_ID FROM TABLE3) t ON t.Table1_ID = t1.ID
JOIN OtherTable o ON t.ID = o.Table_ID

しかし、ここではテーブル構造が間違っていると思います。

o.Table_ID が 2 つの異なるテーブルを指すことができると、制約によって参照整合性を強制することができなくなります。また、ID が両方のテーブルに同時に存在する場合もあります。

状況に応じて (これらの偽の名前から推測するのは難しい)、OtherTable に 2 つの異なる列を作成するか、Table2 と Table3 に FK を作成して OtherTable にするか、または関係を保持するために追加のテーブルを作成します。

于 2013-07-31T21:17:01.397 に答える