2017-03-27 18 views
0

Lutter avec des requêtes corrélées et voulu savoir si quelqu'un pourrait partager un meilleur exemple/explication comment créer une «requête corrélée». Je comprends que les requêtes internes/externes sont dépendantes les unes des autres mais ne croient toujours pas que ma solution est exacte ou se sentent très sûrs lors de leur codage et pensent à pratiquer la conversion des requêtes que j'ai travaillées à corréler. Voici exemple de requête de travail:Comment faire pour convertir la requête à la requête corrélée

SELECT p.productid, p.productname, SUM(od.unitprice - od.discount) * od.qty 
    AS total_amount 
    FROM Production.Products AS p 
    JOIN Sales.OrderDetails AS od 
    ON p.productid = od.productid 
    JOIN Sales.Orders AS o 
    ON od.orderid = o.orderid 
    WHERE o.shipcountry = 'USA'; 

--EDITED--Converted to Correlated Query 

Donc, si je voulais en faire un sous-requête corrélative cela devrait être la solution. Merci pour les conseils et les conseils.

SELECT productid, productname 
FROM Production.Products AS t1 
WHERE productid = (SELECT SUM(od.unitprice - od.discount) * od.qty AS 
total_amount 
    FROM Sales.OrderDetails AS od 
     JOIN Sales.Orders AS o 
    ON od.orderid = o.orderid 
    JOIN Production.Products AS t2 
    ON t2.productid = t1.productid 
    WHERE o.shipcountry = 'USA') 
GROUP BY productid, productname; 

Merci pour les conseils et les conseils.

Répondre

1

Puisque vous sélectionnez à la fois les produits et table OrderDetails, vous devez utiliser la seule solution rejoindre:

select p.productid, 
    p.productname, 
    SUM((od.unitprice - od.discount) * od.qty) as total_amount 
from Production.Products as p 
join Sales.OrderDetails as od on p.productid = od.productid 
join Sales.Orders as o on od.orderid = o.orderid 
where o.shipcountry = 'USA' 
group by p.productid, 
    p.productname 

Notez la clause ajoutée group by que vous utilisez sum (également fixe).

1

Je pense que c'est ce que vous voulez:

SELECT p.productid, p.productname, 
     SUM(od.unitprice - od.discount) * p.qty AS total_amount 
FROM Production.Products p JOIN 
    Sales.Orders o JOIN 
    Sales.OrderDetails od 
    ON o.orderid = od.orderid 
WHERE o.shipcountry = 'USA' 
GROUP BY p.productid, p.productname; 

qu'une corrélation ne convient pas ici. Vous renvoyez des résultats de plusieurs tables. Il suffit de faire le JOIN correctement avec un GROUP By.

+1

prix unitaire et une remise sont dans la table OrderDetails pour OP pour une raison – GurV

+0

oui, j'ai oublié de mettre le groupe par là. Est-ce que la deuxième requête répondrait ou non à la sous-requête Correlated (en ajoutant le groupe bien sûr)? Le produit de la requête externe correspond à la requête interne et le résultat est ajouté? – allendks45

+0

@ allendks45. . . Je ne comprends pas votre commentaire. Cette version a toujours eu un «groupe par». –