-1
votes

Comment sélectionner des lignes dans la table parent en fonction d'une valeur dans la table enfant

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


0 commentaires

3 Réponses :


0
votes

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;


1 commentaires

Merci! C'était le mot-clé DISTINCT qui m'échappait alors que j'y pensais.



0
votes

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


0 commentaires

0
votes

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


1 commentaires

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