繁体   English   中英

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

[英]SQL Server Inner Join on same column with two tables

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

分类项目

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

A1_物品

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中没有任何表示“类型”的字段。

我想我可以通过执行2个查询(或)通过对2个独立查询的结果进行并集来实现。

在我的实时场景中,我有多个与这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'

小提琴演示

另一种方法:

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

试试这个

 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM