0

我正在考虑使用以下 3 个表进行内部连接的可能性。

分类项目

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

A1_Items

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 回答