我有2個表:轉換多個行到一個SQL Server中
產品:
ProductId | Name | Description
----------+-------+-------------------------------------
1 | shirt | this is description for shirt
2 | pent | this is description for pent
ProductOverride:
ProductOverrideId | ColumnId | Value | ProductId
------------------+-----------+------------------------+-----------
1 | 1 | overridden name | 1
2 | 2 | overridden description | 1
其中ColumnId
是sys.columns
column_id
。
我要選擇具有下列要求的所有產品:
如果產品名稱或產品說明中ProductOverride表被覆蓋,得到的名稱/描述重寫的值,否則得到的名稱/描述值產品表。
輸出示例:
ProductId | Name | Description
----------+-----------------+---------------------------
1 | overridden name | overridden description
2 | pent | this is description for pent
我有以下查詢返回確切的結果。
DECLARE @productNameColumnId INT = 1;
DECLARE @productDescriptionColumnId INT = 2;
WITH OverriddenProductNameCTE ([Value], [ProductId]) AS
(
SELECT
temp.[Value], temp.ProductId
FROM
ProductOverride temp
WHERE
temp.ColumnId = @productNameColumnId
), OverriddenProductDescriptionCTE ([Value], [ProductId]) AS
(
SELECT
temp.[Value], temp.ProductId
FROM
ProductOverride temp
WHERE
temp.ColumnId = @productDescriptionColumnId
)
SELECT
p.ProductId,
CASE
WHEN EXISTS(SELECT [Value]
FROM OverriddenProductNameCTE opnc
WHERE opnc.ProductId = p.ProductId)
THEN (SELECT [Value]
FROM OverriddenProductNameCTE opnc
WHERE opnc.ProductId = p.ProductId)
ELSE p.[Name]
END AS [Name],
CASE
WHEN EXISTS(SELECT [Value]
FROM OverriddenProductDescriptionCTE opdc
WHERE opdc.ProductId = p.ProductId)
THEN (SELECT [Value]
FROM OverriddenProductDescriptionCTE opdc
WHERE opdc.ProductId = p.ProductId)
ELSE p.[Description]
END AS [Description]
FROM
product p
但在CASE
發言,我有以下的重複代碼:
SELECT [Value]
FROM OverriddenProductNameCTE opnc
WHERE opnc.ProductId = p.ProductId
如果CASE
語句的第一個條件是真實的數據庫管理系統將在THEN
部分再次執行相同的查詢,這意味着。
我想在簡化查詢和處理方面都改進這個查詢。
此外,如果在這種情況下使用CTE有什麼優勢?
難道只有2列,或者是隻爲例子嗎? –
還有更多列。我剛剛加了2個例子。 –