[英]T-SQL: Single-Query Join with either one Table or another
我的問題如下:假設你有三個不同的表(產品,票據和退貨)
| ProductId | Name |
=====================
| 1 | Car |
| BillId | ProductId | Amount |
=================================
| 1 | 1 | 100$ |
| 2 | 1 | 200$ |
| ReturnId | ProductId | Amount |
===================================
| 1 | 1 | 50$ |
SINGLE Query如何獲得以下輸出:
| Product-ID | Name | Type | Amount |
=====================================
| 1 | Car | Bill | 100$ |
| 1 | Car | Bill | 200$ |
| 1 | Car | Ret | 50$ |
我正在嘗試各種各樣的聯盟,不知何故,我無法理解這一點。 我究竟做錯了什么? 我到目前為止找到的最接近的解決方案是這樣的:
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
有一件事對我來說非常重要:真正的場景查詢要大得多,而且我不想復制/粘貼查詢的整個邏輯,就像使用聯盟時的情況一樣。
以下將根據需要工作,
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
你可以使用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
如果您不喜歡嵌套子查詢的外觀,可以采用GarethD的優秀解決方案並將其轉換為公用表表達式(CTE)
WITH Transactions AS (
SELECT ProductID, 'Bill' [Type], Amount FROM Bills
UNION ALL
SELECT ProductID, 'Ret' [Type], Amount FROM Returns
)
SELECT p.*, [Type], Amount
FROM Products p
JOIN Transactions t
ON t.ProductID = p.ProductID
SELECT *
(SELECT Products.ProductID,
Products.Name,
'Bill' as Type,
Bills.Amount
FROM Products INNER JOIN Bills
on Products.ProductID = Bills.ProductID
UNION
SELECT Products.ProductID,
Products.Name,
'Ret' as Type,
Returns.Amount
FROM Products INNER JOIN Returns
on Products.ProductID = Returns.ProductID) as iTable
WHERE iTable.ProductID = 1
嘗試UNION查詢 - 類似於
SELECT *, 'bill' FROM
dbo.product
INNER JOIN bills ON dbo.product.Product_Id = dbo.bills.product_id
UNION
SELECT *, 'return' FROM
dbo.product
INNER JOIN dbo.returns ON dbo.product.Product_Id = dbo.returns.product_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.