Shi*_*ion 6 sql t-sql left-join
我的问题如下:假设你有三个不同的表(产品,票据和退货)
| ProductId | Name |
=====================
| 1 | Car |
| BillId | ProductId | Amount |
=================================
| 1 | 1 | 100$ |
| 2 | 1 | 200$ |
| ReturnId | ProductId | Amount |
===================================
| 1 | 1 | 50$ |
Run Code Online (Sandbox Code Playgroud)
SINGLE Query如何获得以下输出:
| Product-ID | Name | Type | Amount |
=====================================
| 1 | Car | Bill | 100$ |
| 1 | Car | Bill | 200$ |
| 1 | Car | Ret | 50$ |
Run Code Online (Sandbox Code Playgroud)
我正在尝试各种各样的联盟,不知何故,我无法理解这一点.我究竟做错了什么?我到目前为止找到的最接近的解决方案是这样的:
SELECT p.*,
(CASE
WHEN b.Amount IS NOT NULL THEN 'Bill'
ELSE 'Ret'
END) AS Type,
COALESCE(b.Amount, r.Amount) AS Amount
FROM Products p
LEFT JOIN Bills b ON b.ProductId = p.ProductId
LEFT JOIN Returns r ON r.ProductId = p.ProductId
Run Code Online (Sandbox Code Playgroud)
有一件事对我来说非常重要:真正的场景查询要大得多,而且我不想复制/粘贴查询的整个逻辑,就像使用联盟时的情况一样.
Gar*_*thD 19
以下将根据需要工作,
SELECT Products.*,
[Type],
Amount
FROM Products
INNER JOIN
( SELECT ProductID, 'Bill' [Type], Amount
FROM Bills
UNION ALL
SELECT ProductID, 'Ret' [Type], Amount
FROM Returns
) transactions
ON transactions.ProductID = Products.ProductID
Run Code Online (Sandbox Code Playgroud)
你可以使用UNION
:
SELECT p.*, 'Bill' as [Type], b.Amount
FROM Products p
INNER JOIN Bills b
ON b.ProductId = p.ProductId
UNION
SELECT p.*, 'Ret' as [Type], r.Amount
FROM Products p
INNER JOIN Returns r
ON r.ProductId = p.ProductId
Run Code Online (Sandbox Code Playgroud)