Considérez les tableaux suivants, quelle serait une requête efficace pour renvoyer 1 ligne pour chaque commande qui a au moins 1 ligne enfant avec un code d'entrepôt spécifique? J'utilise SQL Server 2016.
OrderNo OrderDt Status Type ------- ---------- ------ -------- 200124 11/21/2020 NEW IN-STORE 200125 11/21/2020 NEW SHIPPING
OrderNo OrderDt Status Type ------- ---------- ------ -------- 200123 11/20/2020 NEW SHIPPING 200124 11/21/2020 NEW IN-STORE
Si je demande l'entrepôt 10:
Table: OrderItems OrderNo ItemCode Warehouse ------- -------- --------- 200123 Item1 10 200124 Item1 10 200124 Item2 20 200125 Item2 20
Si je demande l'entrepôt 20:
Table: Orders OrderNo OrderDt Status Type ------- ---------- ------ -------- 200123 11/20/2020 NEW SHIPPING 200124 11/21/2020 NEW IN-STORE 200125 11/21/2020 NEW SHIPPING
3 Réponses :
En supposant que lorsque vous dites "Quand je demande Warehouse X", vous exécutez des requêtes individuelles pour un seul entrepôt, il suffit d'une simple INNER JOIN
et d'une clause WHERE
:
SELECT o.OrderNo, o.OrderDt, o.Status, o.Type, oi.ItemCode, oi.Warehouse FROM Orders o INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo;
Si vous souhaitez tout avoir dans un seul jeu de résultats, ajoutez ItemCode
et Warehouse
à la requête et ItemCode
la clause WHERE
.
SELECT DISTINCT o.OrderNo, o.OrderDt, o.Status, o.Type FROM Orders o INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo WHERE Warehouse = 10; SELECT DISTINCT o.OrderNo, o.OrderDt, o.Status, o.Type FROM Orders o INNER JOIN OrderItems oi ON o.OrderNo = oi.OrderNo WHERE Warehouse = 20;
Merci! C'était le mot-clé DISTINCT qui m'échappait alors que j'y pensais.
Vous pouvez utiliser exists
:
select o.* from orders o where exists ( select 1 from orderitems oi where oi.orderno = o.orderno and oi.warehouse = 10 )
Pour des performances avec cette requête, considérez un index sur les orderitems(orderno, warehouse)
.
Vous pouvez utiliser la requête ci-dessous pour filtrer l'entrepôt avant de rejoindre les tables:
select distinct o.orderNo, o.OrderDt, o.Status, o.Type from orders o, (select orderNo, Warehouse from orderitems where warehouse = ##) o1 on o1.orderNo = o.orderNo
Évoluer! Personne ne devrait utiliser des jointures à l' ancienne . Et votre jointure à l'ancienne générera une erreur car vous avez essayé d'utiliser les deux techniques de jointure.