【问题标题】:Joins on multiple tables to create a view [duplicate]连接多个表以创建视图 [重复]
【发布时间】: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


【解决方案1】:

您可以使用以下查询

    SELECT 
        SH.date, 
        SH.purchaseid, 
        SH.salesid, 
        P.seller, 
        S.buyer
    FROM stockhistory SH
    LEFT JOIN Purchases P on P.PurchaseID=SH.PurchaseID
    LEFT JOIN Sales S on S.salesid=SH.salesid

【讨论】:

  • 我正要自己发布这个作为答案。你打败了我。谢谢!
猜你喜欢
  • 2019-03-12
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2019-10-28
相关资源
最近更新 更多