Интеграция SELECT в уже написанный SQL-запрос - PullRequest
0 голосов
/ 07 октября 2019

Итак, я получил SQL-запрос, который намного выше моего уровня знаний, и я не могу понять, как добавить новый столбец в качестве вывода при выполнении запроса.

    SELECT ProductId,Name as Provider FROM (
SELECT  COALESCE(ByExternalImageId.ProductId,EANProductImage.ProductId) as ProductId, COALESCE(ByExternalImageId.ProductImageProviderId,EANProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                               LEFT JOIN
                               (
                               SELECT Product.Id as ProductId,MIN(EANProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                                   INNER JOIN ProductImage as EANProductImage ON
                                       EANProductImage.ExternalImageId = Product.EAN
                                   INNER JOIN ProductImageAngle as EANProductImageAngle ON
                                       EANProductImage.AngleId = EANProductImageAngle.Id
                                   WHERE HasImage=1
                                   GROUP BY Product.Id
                               ) as EANProductImage ON
                                   EANProductImage.ProductId = Product.Id
                               LEFT JOIN (
                               SELECT top 1 Product.Id as ProductId,MIN(ExternalProductImage.ProductImageProviderId) as ProductImageProviderId FROM Product
                                   INNER JOIN ProductImage as ExternalProductImage ON
                                       ExternalProductImage.ExternalImageId  = Product.ExternalImageId
                                   INNER JOIN ProductImageAngle as ExternalProductImageAngle ON
                                       ExternalProductImage.AngleId = ExternalProductImageAngle.Id
                                   WHERE HasImage=1
                                   GROUP BY Product.Id
                               ) as ByExternalImageId ON
                                   ByExternalImageId.ProductId = Product.Id
                                   WHERE COALESCE(ByExternalImageId.ProductImageProviderId,EANProductImage.ProductImageProviderId) IS NOT NULL                                
                                  ) as images INNER JOIN ProductImageProvider ON ProductImageProvider.Id = images.ProductImageProviderId where Name='GS1'

Правильно, поэтому выше приведен запрос, который мне дали. Это выводит следующее:

enter image description here

Что я не мог понять, так это как я могу также выбрать столбец [Name] из dbo.Product и присоединиться к немус токовым выходом на ProductId? Я знаю основной синтаксис, необходимый для этого, но я не знаю, где мне нужно интегрировать его с кодом выше.

Так что мне нужно что-то вроде: SELECT Product.Name FROM Product inner join [the query above]в конечном итоге вывод выглядит так:

ProductId          Provider          Name
....               ....              ....

Я понимаю, как глупо звучит этот вопрос, но я пробовал множество способов интегрировать эту маленькую вещь в запрос, представленный выше. Моя проблема в том, что я не понимаю код полностью (особенно потому, что он не был написан мной), чтобы фактически применить его на практике.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Вы можете удалить один слой подвыбора, чтобы получить желаемый ответ. Следует отметить, что провайдер может быть только «GS1», так как это то, что фильтрует ваш запрос. Я удалил все столбцы или объединения, которые не используются в вашем верхнем запросе:

 SELECT  COALESCE(ByExternalImageId.ProductId,EANProductImage.ProductId) as ProductId, 
          Product.Name As Provider
  FROM Product
  LEFT JOIN
     (
        SELECT Product.Id as ProductId,
               MIN(EANProductImage.ProductImageProviderId) as ProductImageProviderId 
        FROM Product
        INNER JOIN ProductImage as EANProductImage 
             ON  EANProductImage.ExternalImageId = Product.EAN
        INNER JOIN ProductImageAngle as EANProductImageAngle 
             ON  EANProductImage.AngleId = EANProductImageAngle.Id
        WHERE HasImage=1
        GROUP BY Product.Id
      ) as EANProductImage 
          ON  EANProductImage.ProductId = Product.Id
      LEFT JOIN 
         (
            SELECT top 1 Product.Id as ProductId,
                   MIN(ExternalProductImage.ProductImageProviderId) as ProductImageProviderId 
            FROM Product
            INNER JOIN ProductImage as ExternalProductImage 
                 ON  ExternalProductImage.ExternalImageId  = Product.ExternalImageId
            INNER JOIN ProductImageAngle as ExternalProductImageAngle 
                 ON  ExternalProductImage.AngleId = ExternalProductImageAngle.Id
            WHERE HasImage=1
            GROUP BY Product.Id
          ) as ByExternalImageId 
              ON  ByExternalImageId.ProductId = Product.Id
    WHERE COALESCE(ByExternalImageId.ProductImageProviderId,EANProductImage.ProductImageProviderId) IS NOT NULL AND
          Product.Name='GS1'
1 голос
/ 07 октября 2019

Вы очень близки, вы должны инкапсулировать весь внутренний запрос с паренами.

Использование подзапроса

SELECT Product.Name,SubqueryAlias.*  FROM Product inner join 
(
    [the query above]
)
AS SubqueryAlias ON SubqueryAlias.ProductID=Product.ProductID

Использование CTE

;WITH As MyCTE
(
     [the query above]
)
SELECT Product.Name, M.Provider FROM Product 
inner join MyCTE M ON M.ProductID=Product.ProductID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...