Как я могу оптимизировать запрос, чтобы получить значения на основе каждого идентификатора? - PullRequest
0 голосов
/ 18 января 2019

Я хотел бы получить значения цен из таблицы B в таблицу A для каждого связанного идентификатора в таблице A. Моя цель - привести цены рядом друг с другом в шесть раз, которые ниже, чем цена в таблице A, на основе порядка идентификаторов в таблицеB и если нет более низкой цены, я привожу ту же цену.

Я уже написал запрос, который работает, но я хотел бы знать, как его оптимизировать.

В написанном запросе я шесть раз использовал левое соединение, чтобы получить значение каждогоИдентификатор таблицы A из таблицы B.

Так есть ли другой способ написать этот запрос, вместо того, чтобы присоединиться к одной таблице шесть раз?

Таблица 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|

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Под другим углом, чтобы посмотреть на него:

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
0 голосов
/ 18 января 2019

Попробуйте запрос ниже.

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
...