SQL - supprimer les doublons d'une jointure gauche
Je suis de la création d'une joint la vue de deux tables, mais je suis arriver indésirables les doublons de table2.
Par exemple: table1 a plus de 9000 dossiers et j'ai besoin de l'avis résultant de contenir exactement les mêmes; table2 peut avoir plusieurs enregistrements avec le même FKID mais je ne veux retourner un enregistrement (aléatoire choisi est ok avec mon client). J'ai le code suivant qui fonctionne correctement, mais la performance est plus lent que prévu (plus de 14 secondes).
SELECT
OBJECTID
, PKID
,(SELECT TOP (1) SUBDIVISIO
FROM dbo.table2 AS t2
WHERE (t1.PKID = t2.FKID)) AS ProjectName
,(SELECT TOP (1) ASBUILT1
FROM dbo.table2 AS t2
WHERE (t1.PKID = t2.FKID)) AS Asbuilt
FROM dbo.table1 AS t1
Est-il un moyen de faire quelque chose de similaire avec des jointures pour accélérer les performances?
Je suis à l'aide de SQL Server 2008 R2.
Je me suis rapproché avec le code suivant (~.5 secondes), mais Distinctes de " seulement de filtrer les enregistrements lorsque toutes les colonnes sont en double (plutôt que seulement la FKID).
SELECT
t1.OBJECTID
,t1.PKID
,t2.ProjectName
,t2.Asbuilt
FROM dbo.table1 AS t1
LEFT JOIN (SELECT
DISTINCT FKID
,ProjectName
,Asbuilt
FROM dbo.table2) t2
ON t1.PKID = t2.FKID
exemples de table
table1 table2
OID, PKID FKID, ProjectName, Asbuilt
1, id1 id1, P1, AB1
2, id2 id1, P5, AB5
3, id4 id2, P10, AB2
5, id5 id5, P4, AB4
Dans l'exemple ci-dessus enregistrements retournés doivent être id5/P4/AB4, id2/P10/AB2, et (id1/P1/AB1 OU id1/P5/AB5)
Ma recherche est venu avec des questions similaires, mais aucun qui a résolu mon problème. lien, lien
Merci d'avance pour votre aide. Ceci est mon premier post alors laissez-moi savoir si j'ai brisé toutes les règles.
- Bienvenue sur StackOverflow. Quand vous postez une question, vous devez également inclure le moteur de base de données que vous utilisez. Si une réponse résout votre problème, alors vous devez les accepter la réponse. Vous pouvez également upvote autant de réponses que vous le souhaitez.
Vous devez vous connecter pour publier un commentaire.
Cela vous donnera les résultats que vous avez demandé et devrait avoir les meilleures performances.
Votre requête initiale est de produire des valeurs arbitraires pour les deux colonnes (l'utilisation de
top
sansorder by
). Vous pouvez obtenir le même effet avec cette:Cette version remplace la
distinct
avec ungroup by
.D'avoir une ligne au hasard dans SQL Server (votre syntaxe suggère que vous utilisez), essayez ceci:
Cela suppose version 2005 ou plus.
Si vous voulez décrit conséquent, vous devez utiliser
INNER JOIN
et à la suite de la requête sauront satisfaire votre besoin:Si vous voulez voir toutes les lignes de la table de gauche (table1) si il a une paire dans le tableau de droite ou pas, puis utilisez
LEFT JOIN
et même requête vous a donné le résultat souhaité.ÉDITÉ
Cette construction a de bonnes performances, et vous n'avez pas besoin d'utiliser des sous-requêtes.