当单个列包含来自2个不同表的值时,如何获取数据?

时间:2015-08-10 07:30:34

标签: sql sql-server database sql-server-2008

我知道这是一个令人困惑的问题,所以让我先解释一下这个场景。

场景是:

有3个表

  1. service_master (id, name, cost, duration, visit_count, remarks)

  2. product_master (id, name, cost)

  3. sell (id, item_id, item_type)

  4. 所以,在 sell

    id 适用于primary key

    item_id 包含2个表格中的数据(product_masterservice_master

    item_type 将用于识别该项目是service还是productP, S

    所以问题是,当我想要为用户获取所有已售商品时,我将如何获取商品名称而不是ID es

    请建议我该怎么做,如果我做错了,请纠正我。

    非常感谢advace !!

3 个答案:

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

如果需要调整/进一步详细说明,请发表评论。