Je suis curieux du moyen le plus efficace d'interroger l'exclusion sur SQL. Par exemple. Il y a 2 tables (tableaux et tableb) qui peuvent être jointes sur 1 colonne (COL1). Je souhaite afficher les données de tablier pour toutes les lignes que Col1 n'existe pas dans la tableb. p>
(Ainsi, en d'autres termes, la tablebonne contient un sous-ensemble de col1 de tablier. Et je souhaite afficher le tabla sans les données existantes dans la tableb) p>
Disons que la tablebe a 100 rangées pendant que le tablier est gigantesque (plus de 1 m rang). Je sais 'pas dans (pas exister)' peut être utilisé mais peut-être qu'il y a des moyens plus efficaces (moins comp. Time) pour le faire.? Je ne suis peut-être pas avec des jointures extérieures? P>
Les extraits de code et les commentaires sont très appréciés. P>
4 Réponses :
Les questions ont été posées à plusieurs reprises. Le moyen le plus rapide est de le faire:
SELECT * FROM table1 WHERE id in (SELECT id FROM table1 EXCEPT SELECT id FROM table2)
Merci d'avoir répondu. Je n'ai pas pu trouver précédemment posé des questions.
Ceci, par exemple, je pense être similaire:
Oui, c'est semblable. Mais il est difficile de trouver cette question car elle manque de description détaillée et de balises. Vous le savez parce que vous avez répondu qu'on il y a 2 jours :)
Hehe. Oui, j'ai essayé de le trouver à travers la recherche manuelle moi-même aussi et je ne pouvais pas. Donc, j'ai peut-être eu un avantage là-bas;)
Avez-vous des références pour sauvegarder votre déclaration? Je suis intéressé à voir des statistiques.
Mon expérience personnelle était avec DB2 où je pouvais grandement améliorer certaines questions. Semble être la même chose pour Oracle selon la réponse de Martin Smith. Je suppose qu'avec non dans l'optimiseur doit être plus intelligent pour obtenir la même performance (l'OMI le moyen le plus rapide de ne pas être de réécrire de la rétablissement de la soustraction définie sur l'ID dans les index de la table1 et de la table2, puis d'obtenir les valeurs De TABLE 1 à l'aide de l'ID, ce qui est exactement ce qui est renversé dans la requête que j'ai suggérée).
Je préfère utiliser
create table #a ( Col1 int ) Create table #b ( col1 int ) insert into #a Values (1) insert into #a Values (2) insert into #a Values (3) insert into #a Values (4) insert into #b Values (1) insert into #b Values (2) Select a.Col1 From #a a Left Join #b b on a.col1 = b.Col1 Where b.Col1 is null
Merci pour la réponse, mais cette solution ne fonctionne pas pour moi. Une des raisons est que col1 ne peut pas être null (la tablebonne n'a que Col1). Donc, votre solution ne me donne aucun résultat.
@ Masa44 - êtes-vous sûr? Ça marche pour moi bien. J'ai ajouté des données de test comme exemple.
Barry, merci pour l'exemple. Votre exemple fonctionne bien mais je n'ai pas fait le faire dans mon cas, je suppose que je fais une petite erreur.
dépend de la SGBDM. Pour Microsoft SQL Server ne pas exister est préféré à la jointure extérieure, car il peut utiliser la jointure anti-semi plus efficace. P>
pour oracle moins est apparemment préféré à ne pas exister (le cas échéant) p >
Vous auriez besoin de regarder les plans d'exécution et de décider. P>
Merci d'avoir répondu. DBMS que je suis intéressé est Oracle. Êtes-vous sûr que moins est plus efficace qu'une requête avec la réponse de Join ou Inflagranti?
@ NOPE MASA44 Pas du tout. Bien que les utilisations de la réponse d'Allagranti, sauf qui est i> moins à Oracle. La recommandation était de regarder les plans d'exécution.
+1 Pour recommander d'enquêter sur des plans d'exécution (sur des données réelles avec des statistiques mises à jour). De plus, la question est la présente des indices.
Merci Martin Smith, bonne recommandation. Si je pouvais, j'aurais aussi voté ça :)
Il n'y a pas de réponse correcte à cette question. Chaque RDBMS a la requête Optimizer qui déterminera le meilleur plan d'exécution basé sur les indices disponibles, les statistiques de table (nombre de lignes, la sélectivité de l'index), condition de jointure, condition de requête, ... p>
Lorsque vous avez une requête relativement simple comme dans votre question, vous pouvez souvent obtenir des résultats dans SQL. Tous les SGDBO en respectant votre intention reconnaîtront votre intention et créeront le même plan d'exécution, quelle que soit la syntaxe que vous utilisez (sous-couches avec ou existez opérateur, interrogez avec Join, ...) P>
Ainsi, la meilleure solution ici consiste ici à écrire une requête la plus simple qui fonctionne, puis vérifiez le plan d'exécution.
Si cette solution n'est pas acceptable, vous devriez essayer de trouver une meilleure requête. p>
Non, les bases de données ne généreront pas le même plan pour différents types de requêtes qui ont le même ensemble de résultats. Si vous regardez le vendeur par Vendor, vous découvrirez les moyens les plus efficaces de faire des types de requêtes spécifiques.
@Hlgem Vous n'avez évidemment jamais examiné les plans d'exécution dans Oracle dans la situation décrite en question.
Non I L; OOK aux plans d'exécution dans SQL Server où il existe d'énormes différences entre de telles approches différentes de la même requête. Et sachant que je sais quel type d'essayer d'essayer. Ecrivez la requête la plus simple est juste un mauvais conseil. Et "chaque SOI SOCIERS REDBMS reconnaîtra votre intention et créera le même plan d'exécution, quelle que soit la syntaxe que vous utilisez" est simplement fausse.
Quel DBMS? SQL Server, MySQL, Oracle? Les capacités des optimiseurs de la requête dans ceux-ci diffèrent.
Oracle. Je serai surpris s'il existe des différences de performance significatives sur divers SGBD.
Oui, vous serez surpris. :)