Comment écrire une requête SQL sans doublons correctement?
Il y a deux tables. Tableau 1 Clients et Tableau 2 Commandes P>
CUSTOMERS (ID, FIRSTNAME, LASTNAME, ADDRESS); ORDERS (ID, PRODUCT_NAME, PRODUCT_PRICE, DATE_ORDER, ID_CUSTOMER, AMOUNT); SELECT DISTINCT CUSTOMERS.ID, ORDERS.PRODUCT_NAME FROM CUSTOMERS INNER JOIN ORDERS ON CUSTOMERS.ID = ORDERS.ID_CUSTOMERS WHERE PRODUCT_NAME = âApple MacBook Air 13â;
4 Réponses :
Savez-vous pourquoi la duplication, non? C'est parce que chaque client que vous pourriez avoir 1 ou plusieurs clients. P>
Donc, si vous souhaitez continuer à filtrer par le produit et supprimez les duplicats, vous pouvez utiliser la clause distincte dans ce cas et à l'instruction SELECT, des champs de référence de la sélection de la table des clients. Si vous avez des champs de la table des clients_orders étant référencés sur le choix, il est en double. P>
Vous pouvez imaginer distinct comme une forme d'un filtre de sortie qui est appliqué lorsque la requête elle-même est terminée. La jointure est utilisée pour construire l'entrée à la requête. Les réponses si courtes sont les suivantes: Oui, vous pouvez le faire. p>
Dans cette requête:
SELECT DISTINCT o.ID_CUSTOMERS, o.PRODUCT_NAME FROM ORDERS o WHERE o.PRODUCT_NAME = 'Apple MacBook Air 13';
sur votre requête: pourquoi vous rejoignez la table des clients? Cela ne fournit rien de ce que nous ne recevons pas de la table des commandes déjà. Votre requête peut être raccourcie: p> ou, comme il s'agit d'un seul produit de toute façon: p> Nous utilisons Nous pouvons écrire la requête différemment pour éviter cela. Nous commençons avec la table des clients et montrons ces identifiants / lignes où nous trouvons au moins une commande sur 'Apple MacBook Air 13'. P> distinct code> est destiné à éliminer les doublons. Ceci est parfois utile. Mais c'est aussi souvent un indicateur pour une requête mal écrite, car: Pourquoi y a-t-il des lignes en double dans le résultat en premier lieu?
Distinct CODE> ici, car un client peut commander un produit plusieurs fois et apparaîtra donc dans les résultats à plusieurs reprises, n'avons-nous pas utilisé
distinct code>. Cependant, nous lisons toutes les lignes «Apple MacBook Air 13», seulement pour enlever certains ou même beaucoup d'entre eux à la fin. P>
SELECT id
FROM customers c
WHERE EXISTS
(
SELECT *
FROM orders o
WHERE o.id_customers = c.id
AND o.product_name = 'Apple MacBook Air 13'
);