如何加入三个表

时间:2011-04-25 17:27:43

标签: sql

我有3个表:订单,客户和供应商

结构和数据:

订单

================================
OrdNo, OrdDt,     OrdType, CSID
--------------------------------
1      01/04/2011    C     2
2      01/04/2011    S     1
--------------------------------

客户

----------
CID, CName
----------
1    John
2    Boby
----------

=========
SID, SName
----------
1    Tony
2    Mohan
----------

如果OrdTYpe =“C”,则从Customers表中选择CSID = CID的数据 如果OrdTYpe =“S”,则从Suppliers表中选择CSID = SID

的数据

如何列出

等记录
--------------------------------------
OrdNo, OrdDt,     OrdType, CSID  CSName
--------------------------------------
1      01/04/2011    C     2     Boby
2      01/04/2011    S     1     Tony
--------------------------------------

3 个答案:

答案 0 :(得分:4)

这会得到你想要的吗?

SELECT ordno, orddt, ordtype, csid,
       COALESCE( c.name, s.name ) csname
  FROM orders o
    LEFT JOIN customer c ON o.ordtype='C' AND c.cid = o.csid
    LEFT JOIN suppliers s ON o.ordtype='S' AND c.sid = o.csid

至少在Oracle中,另一种可能性是:

SELECT ordno, orddt, ordtype, csid,
       CASE WHEN ordtype='C' THEN (SELECT name FROM customer WHERE cid = csid)
            WHEN ordtype='S' THEN (SELECT name FROM suppliers WHERE sid = csid)
       END csname
  FROM orders;

答案 1 :(得分:1)

马丁有一个很好的观点。我不是专业人士,但我建议制作一个中间表,让您可以让客户和供应商分开,但仍然可以从一组常见的ID中获取

订单

========================
OrdNo, OrdDt,     CSID
------------------------
1      01/04/2011   2
2      01/04/2011   1
-------------------------

的ClientID

---
ID
---
1
2
3
4
---

客户

----------
CID, CName
----------
1    John
3    Boby
----------

=========
SID, SName
----------
2    Tony
4    Mohan
----------

这样你就得到了类似的东西:

-------------------------------
OrdNo, OrdDt,      CSID  CSName
-------------------------------
1      01/04/2011    2     Tony
2      01/04/2011    1     John
-------------------------------

通过回溯(现在)唯一ID,您将能够判断它是客户还是供应商......我也非常确定您的SQL将以此路线运行得更快(不要抱着它虽然)。如果您喜欢这个想法,我可以查看SQL来支持它。

答案 2 :(得分:0)

SELECT o.[OrdNo], o.[OrdDt], o.[OrdType], o.[CSID],
    CASE WHEN o.[OrdType] = 'C'
        THEN c.[CName]
        ELSE s.[SName]
    END as [CSName]
FROM Orders AS o
LEFT JOIN Customers AS c
    ON o.[CSID] = c.[CID]
LEFT JOIN Suppliers AS s
    ON o.[CSID] = s.[SID]