【发布时间】:2017-05-11 16:22:53
【问题描述】:
我想通过连接三个表来创建一个视图。
架构有点复杂,所以为了简单起见,我只提到问题所需的表和列。
有一个表sales 有两列:
SaleID(pkey),
Buyer,
Amount.
第二个表是purchases,有两列:
PurchaseID(pkey),
Seller,
Amount.
我有第三张桌子stockhistory,它跟踪材料的流动。
该表的架构是:
Date,
PurchaseID(fkey to column PurchaseID, Purchases Table),
SalesID(fkey to column SalesID, Sales Table),
Amount(calculated amount inserted here).
现在,每条stockhistory 记录都对应于Purchases 表或Sales 表的记录,但不能同时对应两者或都不对应。
为此,我有一个约束:
([salesid] IS NULL AND [purchaseid] IS NOT NULL OR [salesid] IS NOT NULL AND
[purchaseid] IS NULL)
现在,在视图StockReport 中,我正在尝试从stockhistory 表中提取所有记录,并希望按原样显示买方或卖方的名称。
我曾尝试编写以下行的 SQL:
SELECT StockHistory.date
, StockHistory.purchaseid
, StockHistory.salesid
, Purchases.seller
, Sales.buyer
WHERE StockHistory.purchaseid = Purchases.purchaseid
OR StockHistory.salesid = Sales.salesid
我怎样才能对LEFT JOIN 做同样的事情?
【问题讨论】:
-
为什么不
FROM STOCKHistory LEFT JOIN sales on.... LEFT JOIN purchases on ...这样您就始终拥有库存历史中的所有记录,并且只有那些与销售或采购相关的记录?现在,如果您对销售或购买施加限制......必须将这些限制作为连接的 AND 标准放在 JOIN 上,否则您会破坏左连接,使它们像内部连接一样。左连接右侧表的限制条件必须放在连接而不是 where 子句中,否则您否定左连接!
标签: sql sql-server database join