SQL Server内部连接在具有两个表的同一列上

时间:2013-10-03 08:31:10

标签: sql sql-server database join

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

CategorizedItems

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

A1_Items

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

A2_items

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

CategorizedItems.linkId可以容纳A1_items.itemid和A2_items.itemid。因此,它们之间没有主键 - 外键关系。

我需要获取CategoryId 1下的项目名称。

是否有可能这样做。我在A1_items和A2_Items中没有任何代表'type'的字段。

我想我可以通过执行2次查询来实现它(或者)通过与2个单独查询的结果进行联合。

在我的实时场景中,我有多个表连接这3个表。重做所有其他表的连接,仅针对上述场景是昂贵的..

对此的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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'