Sql 如何连接三个表

Sql 如何连接三个表,sql,Sql,我有3张表:订单、客户和供应商 结构和数据: 命令 客户 供应商 如果OrdTYpe=C,则从Customers表中选取CSID=CID的数据 如果OrdTYpe=S,则从供应商表中选取CSID=SID的数据 如何列出像这样的记录 -------------------------------------- OrdNo, OrdDt, OrdType, CSID CSName -------------------------------------- 1 01/04/201

我有3张表:订单、客户和供应商

结构和数据:

命令 客户 供应商 如果OrdTYpe=C,则从Customers表中选取CSID=CID的数据 如果OrdTYpe=S,则从供应商表中选取CSID=SID的数据

如何列出像这样的记录

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

这是你想要的吗

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;

马丁说得很有道理。我不是专业人士,但我建议您制作一个中间表,让您可以将客户和供应商分开,但仍然可以从一组常见的id中提取

命令

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

---
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来支持它。

您的结构似乎是错误的。在csid列中有两种不同类型的id意味着您将无法强制执行引用完整性,而不得不像问题中所需要的那样进行混乱的连接。您确实意识到,此结构将需要一个触发器来防止孤立行,因为您将无法使用外键约束。因此,是什么阻止人们添加CSID=12345,OrdType='C'?是什么阻止某人删除CID=2的客户行并孤立他们的订单?在任何情况下,我都不会允许这种设计保持这种状态,因为您要求的是数据完整性问题。永远不要允许一列根据另一列具有多个含义,尤其是当它应该是外键时。似乎不仅仅是一列被赋予了多个含义。据我所知,客户和供应商的订单应该存储在这里的一个表中。在我看来,这是相当错误的,因为它们是非常不同的实体,即使是相似的实体。
---
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
-------------------------------