我知道这是一个令人困惑的问题,所以让我先解释一下这个场景。
场景是:
有3个表
service_master (id, name, cost, duration, visit_count, remarks)
product_master (id, name, cost)
sell (id, item_id, item_type)
所以,在 sell
表
id
适用于primary key
,
item_id
包含2个表格中的数据(product_master
和service_master
)
item_type
将用于识别该项目是service
还是product
(P, S
)
所以问题是,当我想要为用户获取所有已售商品时,我将如何获取商品名称而不是ID
es
请建议我该怎么做,如果我做错了,请纠正我。
非常感谢advace !!
答案 0 :(得分:1)
如何选择取决于您想要选择的当然: - )
以下是有关如何选择所有数据的示例:
select s.*, sm.name, sm.cost, sm.duration
from sell s
join service_master sm on sm.id = s.item_id
where s.item_type = 'SERVICE'
union all
select s.*, pm.name, pm.cost, null
from sell s
join product_master pm on pm.id = s.item_id
where s.item_type = 'PRODUCT';
答案 1 :(得分:1)
基本上你需要如下的逻辑:
Select * from Sell S
left join Service_master SM on S.item_id =SM.id and S.item_type like 'S'
left join Prodcut_master PM on S.item_id =PM.id and S.item_type like 'P'
select
部分中的用例条件如果要将名称返回为单个
Select ISNULL(SM.name,PM.name) as name from Sell S
left join Service_master SM on S.item_id =SM.id and S.item_type like 'S'
left join Prodcut_master PM on S.item_id =PM.id and S.item_type like 'P'
答案 2 :(得分:1)
如果ID对服务和产品表都是唯一的(可能通过使用序列),您可以:
SELECT
sell.id sell_id
, sell.item_type
, item_detail.id
, item_detail.name
, item_detail.cost
FROM sell
JOIN
(SELECT id, name, cost FROM service_master
UNION ALL
SELECT id, name, cost FROM product_master
) item_detail
ON sell.item_id = item_detail.id
;
否则,您还有另一个选项(除了Thorsten Kettner和DhruvJoshi建议的那个),如果您的表很大,您可能需要测试性能影响 - 但是您想要检索非常小的数据子集(例如:单一发票):
SELECT
id sell_id
, CASE item_type
WHEN 'P'
THEN (SELECT name FROM product_master WHERE sell.item_id = id)
WHEN 'S'
THEN (SELECT name FROM service_master WHERE sell.item_id = id)
END AS item_name
FROM sell
;
查看实际操作:SQL Fiddle
有一种简单地连接表格的方法 - 甚至适用于重叠ID:
SELECT
sell.id sell_id
, sell.item_type
, item_detail.id
, item_detail.name
, item_detail.cost
FROM sell2 sell
JOIN
(SELECT 'S' flag, id, name, cost FROM service_master2
UNION ALL
SELECT 'P', id, name, cost FROM product_master2
) item_detail
ON sell.item_type = item_detail.flag
AND sell.item_id = item_detail.id
;
比较见:SQL Fiddle。
如果需要调整/进一步详细说明,请发表评论。