2017-06-07 2 views
2

Je fais des requêtes de pratique pour améliorer mes compétences SQL (je suis un débutant) et j'ai rencontré ce problème que j'ai besoin d'aide pour utiliser la base de données Northwind. La requête demandée devrait:requête de comparaison SQL

Donner le nom des employés et la ville où ils vivent pour les employés qui ont vendus à des clients dans la même ville.

Ce que j'ai écrit pour c'était:

USE Northwind; 
    SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    INNER JOIN Customers ON c.City = e.City 
    WHERE e.City = ANY(SELECT Customers.City FROM Customers); 

Je suis revenu 6 employés, mais je ne suis pas sûr qu'ils sont corrects et je crois que ma déclaration est le WHERE mauvais aussi bien. En gros, ma question est la suivante: est-ce que j'utilise les bonnes instructions de jointure et comment puis-je filtrer les résultats avec l'instruction WHERE? Je ne sais pas exactement comment comparer un enregistrement spécifique avec d'autres enregistrements. Venant d'un arrière-plan Java, je suis habitué aux boucles for-loops qui peuvent vérifier chaque "objet" individuel (enregistrement) avec un champ spécifique d'un autre "objet". Dans ce cas, je me demande comment je peux vérifier l'attribut City de chaque enregistrement de la table Employees avec l'attribut City des enregistrements de la table Customers. Tout conseil est apprécié, merci!

+1

Vos jointures ne sont pas correctes, car vous vous joignez deux fois à la table Clients. Changez 'INNER JOIN Customers ON' en' AND' et débarrassez-vous de la clause WHERE et vous devriez être bon. – Welbog

Répondre

1

Je pense que vous avez seulement besoin de se joindre à la table des clients une fois que les deux exigences (être du même ordre et même ville que l'employé) comme requis rejoindre par exemple

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID AND c.City = e.City 

Sinon, vous pouvez simplement se joindre à la client sur l'identifiant de la commande et filtrer l'exigence de la ville dans la clause where. Côté performance, il ne devrait pas y avoir de différence si vous allez regarder en arrière sur le script à un moment donné, il peut vous aider à vous rappeler

SELECT DISTINCT FirstName, LastName, e.City 
    FROM Employees e 
    INNER JOIN Orders o ON e.EmployeeID = O.EmployeeID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    WHERE e.City = C.City 

Je pense que la partie importante pour obtenir votre tour de tête est que, après vous avez rejoint la table c'est effectivement une table avec des colonnes des deux (ou plus avec plusieurs jointures). Les conditions de jointure interne filtreront les lignes qui ne correspondent pas entre les deux tables et vous devrez ensuite comparer les colonnes

+0

Je ne savais pas que vous pouviez utiliser une instruction AND pour les jointures, alors merci de m'avoir appris ça! Aussi, comment j'interprète ceci est que je ne pense pas que ce serait logiquement correct parce que la requête demandée est pour un employé qui a réellement vendu à un client spécifique a la même valeur de ville qu'eux. Est-ce que INNER JOIN sur le EmployeeID est couvert? –

+0

oui cela fonctionne pour ce cas. Lorsque vous joignez deux tables avec une jointure interne, vous créez effectivement une nouvelle table plus grande avec des colonnes provenant des deux tables, votre clause on va filtrer. Je pourrais ajouter quelques exemples de tableaux et de résultats à la réponse si cela vous aide à visualiser? – MarkD

+0

Ok, je comprends. Je comprends Joins à un niveau de base Je ne savais pas si dans ce cas, il serait effectivement filtrer les résultats pour ce dont j'avais besoin dans ma requête. Merci pour l'aide! –