J'ai deux tables appelées Employee (colonnes: Id, Name) et DataSource (colonnes: Id, EmployeeId, DataSourceName).Recherche de lignes du tableau A sans enregistrement dans la table jointe B
Chaque employé peut être exporté vers zéro ou plusieurs sources de données et d'imaginer situation suivante:
table des employés
+----+-------------+
| Id | Name |
+----+-------------+
| 1 | Ivan |
| 2 | Adam |
+----+-------------+
table DataSource:
+----+---------------------------------+
| Id | EmplpoyeeId | DataSourceName |
+----+---------------------------------+
| 1 | 1 | Source1 |
| 2 | 1 | Source2 |
| 3 | 2 | Source2 |
+----+---------------------------------+
je besoin d'une requête pour déterminer quel employé n'est pas exporté vers 'Source1' (le résultat devrait être 'Adam' dans ce cas car il est exporté vers 'Source2' uniquement). Tableaux Employee et DataSource peuvent avoir une grande quantité d'enregistrements (en milliers).
Il existe quelques techniques pour le déterminer et nous devons trouver celui avec les meilleures performances. Il y a peu, qui est venu à mon esprit:
gauche JOIN:
SELECT Employee.Id
FROM Employee
LEFT JOIN DataSource ON DataSource.EmployeeId = Employee.Id AND DataSource.DataSourceName = 'Source1'
WHERE DataSource.Id IS NULL
INNER SELECT:
SELECT Employee.Id
FROM Employee
WHERE NOT EXIST (SELECT NULL FROM DataSource WHERE DataSource.EmployeeId = Employee.Id AND DataSource.DataSourceName = 'Source1')
EXCEPTION:
SELECT Employee.ID
FROM Employee
EXCEPT
SELECT Employee.Id
FROM Employee
INNER JOIN DataSource ON DataSource.EmployeeId = Employee.Id AND DataSource.DataSourceName = 'Source1'
Avant de commencer les analyses comparatives J'aimerais pour me demander s'il y a plus de moyens que je devrais prendre en compte (et qui pourraient bien fonctionner). Pourriez-vous s'il vous plaît partager vos idées pour la requête la plus performante.
Vous devez simplement tester, mais le WHERE NOT EXISTS "devrait" être plus rapide, car il n'a pas besoin de faire la jointure complète et peut sortir tôt ... mais cela dépendra d'un certain nombre de facteurs dont vous avez vraiment besoin juste pour tester – Milney
Je pense que oui, nous pouvons également quitter après la première inscription (en utilisant SELECT TOP 1) - cela pourrait aussi jouer pour WHERE NOT EXISTS – jabko87
Si vous utilisez un select dans un NOT EXIST(), vous n'avez pas besoin pour utiliser TOP 1, il s'arrêtera automatiquement après avoir trouvé un enregistrement – Milney