我想获取表A中每个相关ID的数据从表B到表A的价格。我的目标是根据表中ID的顺序使价格比表A中的价格低六倍。 B,如果没有更低的价格,我带来相同的价格值。
我已经编写了一个有效的查询,但是我想知道如何对其进行优化。
在我编写的查询中,我使用左联接六次以从表B中获取表A的每个ID的值。
那么还有什么其他方法可以写此查询,而不是将同一张表连接六次?
表A:
|Price| |ID||ID_1||ID_2||ID_3||ID_4||ID_5||ID_6|
|129.90| |1| |1| |1| |1| |1| |1| |1|
|149.90| |2| |1| |1| |1| |1| |1| |1|
|199.90| |3| |2| |1| |1| |1| |1| |1|
|249.90| |4| |3| |2| |1| |1| |1| |1|
|299.90| |5| |4| |3| |2| |1| |1| |1|
|399.90| |6| |5| |4| |3| |2| |1| |1|
表B:
| Price ||PriceID|
|129.90| |1|
|149.90| |2|
|199.90| |3|
|249.90| |4|
|299.90| |5|
|399.90| |6|
查询:
> SELECT i.*,
f.Price AS NewPrice1,
f1.Price AS NewPrice2,
f2.Price AS NewPrice3,
f3.Price AS NewPrice4,
f4.Price AS NewPrice5,
f5.Price AS NewPrice6
> FROM #TableA i
> LEFT JOIN #TableB f ON i.ID_1 = f.PriceID
LEFT JOIN #TableB f1 ON i.ID_2 = f1.PriceID
LEFT JOIN #TableB f2 ON i.ID_3 = f2.PriceID
LEFT JOIN #TableB f3 ON i.ID_4 = f3.PriceID
LEFT JOIN #TableB f4 ON i.ID_5 = f4.PriceID
LEFT JOIN #TableB f5 ON i.ID_6 = f5.PriceID
输出:
|Price| |ID||ID_1||ID_2||ID_3||Price_1||Price_2||Price_3||Price_4||Price_5||Price_6|
|129.90| |1| |1| |1| |1| |129.90| |129.90| |129.90||129.90||129.90||129.90|
|149.90| |2| |1| |1| |1| |129.90| |129.90| |129.90||129.90||129.90||129.90|
|199.90| |3| |2| |1| |1| |149.90| |129.90| |129.90||129.90||129.90||129.90|
|249.90| |4| |3| |2| |1| |199.90| |149.90| |129.90||129.90||129.90||129.90|
|299.90| |5| |4| |3| |2| |249.90| |199.90| |149.90||129.90||129.90||129.90|
|399.90| |6| |5| |4| |3| |299.90| |249.90| |199.90||129.90||129.90||129.90|
答案 0 :(得分:1)
从另一个角度看:
DECLARE @A TABLE
(
Price INT,
ID_1 INT,
ID_2 INT,
ID_3 INT
)
INSERT INTO @A
(
Price,
ID_1,
ID_2,
ID_3
)
VALUES
(129.90, 1, 1, 1),
(199.90, 2, 1, 1),
(249.90, 3, 2, 1),
(299.90, 4, 4, 3),
(399.90, 6, 5, 4)
DECLARE @B TABLE
(
Price INT,
PriceID INT
)
INSERT INTO @B
(
Price,
PriceID
)
VALUES
(129.90, 1),
(149.90, 2),
(199.90, 3),
(249.90, 4),
(299.90, 5),
(399.90, 6)
SELECT
a.Price,
SUM(b.NewPrice1),
SUM(b.NewPrice2),
SUM(b.NewPrice3)
FROM @A a
CROSS APPLY
(
SELECT
CASE WHEN PriceID = a.ID_1 THEN Price ELSE NULL END AS NewPrice1,
CASE WHEN PriceID = a.ID_2 THEN Price ELSE NULL END AS NewPrice2,
CASE WHEN PriceID = a.ID_3 THEN Price ELSE NULL END AS NewPrice3
FROM @B
) b
GROUP BY a.Price
答案 1 :(得分:0)
请尝试以下查询。
SELECT
i.*,
(SELECT
f.Price
FROM #TableB f
WHERE i.ID_1 = f.PriceID)
AS NewPrice1,
(SELECT
f1.Price
FROM #TableB f1
WHERE i.ID_2 = f1.PriceID)
AS NewPrice2,
(SELECT
f2.Price
FROM #TableB f2
WHERE i.ID_3 = f2.PriceID)
AS NewPrice3,
(SELECT
f3.Price
FROM #TableB f3
WHERE i.ID_4 = f3.PriceID)
AS NewPrice4,
(SELECT
f4.Price
FROM #TableB f4
WHERE i.ID_5 = f4.PriceID)
AS NewPrice5,
(SELECT
f5.Price
FROM #TableB f5
WHERE i.ID_6 = f5.PriceID)
AS NewPrice6
FROM #TableA i