web-dev-qa-db-fra.com

Jointure interne à une instruction select où l'instruction select interne où la clause fait référence au select externe?

Ceci est une requête allégée de mon plus gros problème, mais l'essentiel est que j'essaie de joindre à l'intérieur une sélection où la sélection est limitée par la sélection externe. Est-ce possible? J'obtiens une erreur concernant l'identifiant multipart S.Item et S.SerialNum sur la sélection interne.

Le Gist est le suivant, nous devons regrouper par élément/série, et la requête est suffisamment grande, nous ne voulons pas revenir en arrière et regrouper tout dans la requête entière pour cette jointure mineure.

SELECT S.Item, S.SerialNum, S.ReceiveDate
    FROM SALES S
    INNER JOIN (SELECT W.Item, W.SerialNum, MIN(W.SalesDate)
                    FROM WARRANTY W
                    WHERE W.Item        = S.Item    AND
                          W.SerialNum   = S.SerialNum
                    GROUP BY Item, SerialNum, SalesDate) WW
        ON S.Item = WW.Item AND WW.SerialNum
9
Alex Kwitny

Il semble que vous ayez votre référence JOIN au mauvais endroit.

SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum

Modifier, en fonction de votre commentaire sur le filtrage, vous pouvez placer une clause WHERE sur votre SELECT interne:

SELECT S.Item, S.SerialNum, S.ReceiveDate, WW.MinSalesDate
FROM SALES S
INNER JOIN 
(
    SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    WHERE yourFilter here
    GROUP BY Item, SerialNum
) WW
        ON S.Item = WW.Item 
       AND S.SerialNum = WW.SerialNum
16
Taryn

Vous pouvez également essayer une expression common_table_expression au lieu d'un JOIN. Vérifiez la clause WITH ici.

Cela pourrait être quelque chose comme ceci:

WITH Warranty_CTE (Item, SerialNum, MinSalesDate)
AS
(
 SELECT W.Item, W.SerialNum, MIN(W.SalesDate) MinSalesDate
    FROM WARRANTY W
    GROUP BY Item, SerialNum
)
SELECT S.Item, S.SerialNum, S.ReceiveDate
FROM SALES S
INNER JOIN Warranty_CTE  WC
        ON S.Item = WC.Item 
       AND S.SerialNum = WC.SerialNum
2
András Ottó