0

以下の3つのテーブルで内部結合を行う可能性を考えています。

分類項目

CategoryId | linkid | type 
------------------------------
1              1        a1  
1              2        a1  
1              1        a2    

A1_アイテム

itemid  | Name | A1 Fields
-----------------------------
1          N1
2          N2

A2_アイテム

itemid  | Name | A2 Fields
-----------------------------
1          N3

CategorizedItems.linkId は、A1_items.itemid と A2_items.itemid を保持できます。そのため、それらの間に主キー - 外部キーの関係はありません。

CategoryId 1 の下にあるアイテムの名前を取得する必要があります。

これを行う可能性はありますか。A1_items と A2_Items に「タイプ」を表すフィールドがありません。

2つのクエリを実行することで(または)2つの別々のクエリの結果を結合することでそれを達成できると思います。

私のリアルタイム シナリオでは、これら 3 つのテーブルに接続された複数のテーブルがあります。上記のシナリオのためだけに、他のすべてのテーブルの結合をやり直すのはコストがかかります..

これに関するヘルプは大歓迎です。

4

3 に答える 3

3

左結合を使用して、次のように結合に適切なフィルターを適用するだけです。

SELECT CategoryId, COALESCE(A1_Items.Name, A2_Items.Name) AS Name
FROM CategorizedItems
LEFT JOIN A1_Items ON A1_Items.itemid = CategorizedItems.linkid AND CategorizedItems.type = 'a1'
LEFT JOIN A2_Items ON A2_Items.itemid = CategorizedItems.linkid AND CategorizedItems.type = 'a2'

Fiddle Demo

于 2013-10-03T08:36:24.567 に答える
2

別のアプローチ:

select CategoryID, Name
from CategorizedItems c
     join (select 'a1' as table, ItemId, Name from A1_Items
           union
           select 'a2' as table, ItemId, Name from A2_Items) a
     on c.linkId = a.ItemId and c.type = a.table
于 2013-10-03T08:41:11.950 に答える
1

これを試してください

 SELECT CategoryId, isnull(A1_Items.Name, A2_Items.Name) AS Name FROM CategorizedItems LEFT JOIN A1_Items ON A1_Items.itemid = CategorizedItems.linkid AND CategorizedItems.type = 'a1' LEFT JOIN A2_Items ON A2_Items.itemid = CategorizedItems.linkid AND CategorizedItems.type ='a2'
于 2013-10-03T08:42:42.910 に答える