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