Sélectionnez la première ligne dans une jointure de deux tables en une seule instruction
J'ai besoin de sélectionner uniquement la première ligne à partir d'une requête qui joint les tableaux A et B. Sur la table B existe plusieurs enregistrements avec le même nom. Il n'y a pas d'identificateurs dans l'une des deux tables. Je ne peux pas changer le système, soit parce que je ne possède pas le DB.
TABLE A
NAME
TABLE B
NAME
DATA1
DATA2
Select Distinct A.NAME,B.DATA1,B.DATA2
From A
Inner Join B on A.NAME = B.NAME
Cela me donne
NAME DATA1 DATA2
sameName 1 2
sameName 1 3
otherName 5 7
otherName 8 9
mais j'ai besoin de récupérer une seule ligne par nom
NAME DATA1 DATA2
sameName 1 2
otherName 5 7
J'ai été en mesure de le faire en ajoutant le résultat dans une table temporaire avec une colonne d'identité, puis sélectionnez le code minimal pour chaque nom.
Le problème, c'est que j'ai besoin de faire cela en une seule instruction.
OriginalL'auteur Oscar Cabrero | 2009-04-21
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne:
Si vous souhaitez sélectionner la valeur la moins élevée de données1 et données2, puis utiliser cette variation:
À la fois les requêtes donnera une ligne par nom.
B.name
, de sorte que vous pouvez utiliser un indice (si il existe). Vous ne serait même pas la peine de rapportsA.name
(en raison de la comparaison).Excellente solution. Merci.
heureux, il a aidé 🙂 cheers!
OriginalL'auteur Rashmi Pandit
À l'aide d'un GROUPE PAR peut vous obtenir à mi-chemin là, mais méfiez-vous. Si vous faites quelque chose comme cela:
Vous obtiendrez le résultat que vous recherchez:
Mais seulement parce que des données que vous testez. Si vous modifiez les données, de sorte qu'au lieu de:
- vous eu:
Il serait de retour:
Noter que otherName ne retourne pas de données DATA1 et DATA2 de la même fiche!
Mise à jour: Une auto-jointure avec une comparaison sur l'une des valeurs de données peuvent vous aider, par exemple:
Toutefois, cela ne fonctionnera que si les valeurs de DATA2 sont uniques par leur NOM.
+1 vous êtes un sauveur. Votre édité auto jointure fonctionne même avec SQL CE où d'autres solutions pour cette cause, de ne pas en raison de SQL CE de ses limites.
OriginalL'auteur Chris Thornhill
Ne sais pas si cela va résoudre votre problème ou pas, mais vous pouvez essayer d'utiliser la clause GROUP BY et group by l'un des noms de colonnes.
DB2 Groupe par tutoriel
OriginalL'auteur Brett Bender
Si vous pouvez ajouter à une table temp et ensuite de la requête, vous pouvez le faire en une seule fois.
Il existe de nombreuses autres façons d'écrire cela, mais c'est la façon dont j'ai été faire les mêmes choses.
OriginalL'auteur Tanktalus
Essayer de déduplication B comme cette
Ajouter plus OU clauses si plus DATAx il existe des colonnes.
Si Un contient des doublons trop, il suffit d'utiliser DISTINCTS comme dans l'OP.
OriginalL'auteur wqw
Cela donnera à votre résultat souhaité, en fournissant B. DATA1 valeurs sont unique dans l'ensemble concernant le tableau A.
Si ils ne sont pas uniques, la seule autre façon je sais, c'est à l'aide de la CROIX APPLIQUER dans MSSQL 2005 et au-dessus.
OriginalL'auteur ingredient_15939
Vous pouvez utiliser le numéro de ligne pour obtenir une ligne pour chaque nom, essayez quelque chose comme ci-dessous
OriginalL'auteur Rams
La balise de cette question indique que ce serait une solution pour DB2, mais ceci est très similaire à MS-SQL server, si donc, essayez ces solutions:
À l'aide de la CROIX, il sera possible d'afficher ce qui existe seulement dans les deux tables
Mais il est possible de changer de l'EXTÉRIEUR vers l'affichage de ce qui existe dans Un sans l'obligation d'exister dans B
Dans la structure de l'appliquer déclaration, il serait également possible d'inclure un relevé de l'ORDRE, car il n'y a aucune indication de l'ordre de sorties dans le tableau B
OriginalL'auteur Healley Monteiro