12
votes

Utiliser des tuples dans SQL dans la clause

Compte tenu d'une base de données comme ceci:

SELECT a,b FROM aTable
WHERE (aTable.a,aTable.b) IN
(SELECT anotherTable.a,anotherTable.b FROM anotherTable);


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser une jointure: xxx


5 commentaires

Cela marche. De plus, la réponse est arrivée en 5 minutes! Toujours intéressé à savoir si mon code proposé est possible / désespérément mal compris / peu importe?


Oui, vous essayez d'écrire d'une manière que vous comprenez, mais ce problème est résolu beaucoup plus naturellement en utilisant la théorie de la définition, la base de SQL. Une utilisation très courante de SQL est de rejoindre deux tables pour obtenir l'intersection d'eux, ce que vous essayez de faire.


@Orbman: In plus intuitif; Joignez-vous à l'époque, c'est trop de science-sciences. Et il s'agit simplement d'avoir plus de construction de première classe d'une langue pour pouvoir accomplir quelque chose de plus facile (pensez aux propriétés de C # VS Java Setter / Getter). Si la valeur de la valeur unique, je pense que vous serez plus que content que si les RDBM que vous utilisez fonctionne également sur des valeurs couples (tuples)


REJOIGNEZ UN PROBLÈME Si une autre mesure a des valeurs en double, il existe plus flexible / preuve future que son coousin: Stackoverflow.com/Questtions/1001543/...


Cet article expliquer les tests définis (dans VS Join Vs Exits) Très bien, y compris le plan logique et d'exécution sur des valeurs non uniques et des valeurs non indexées: ExplicExtended.com/2009/06/16/in-vs-join-vs-exists



20
votes

Votre code fonctionne si vous le faites dans PostgreSQL ou Oracle. Sur MS SQL, il n'est pas pris en charge

Utilisez ceci: p>

SELECT a,b FROM aTable
WHERE     
EXISTS
(
    SELECT *
    FROM anotherTable
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b
);


4 commentaires

Réponse définitive dans 10 minutes! ne fonctionne pas dans SQLite :-( voté et accepté


Même si cela fonctionnait dans SQLite, je recommanderais de ne pas le faire. Ceci est tenu de confondre les futurs mainteneurs de votre code. (Remarque: vous êtes le futur mainteneur, donc c'est vous qui sera confus)


@tster - Je ne vois pas la source de toute confusion


"C'est un peu boiteux, pendant plus d'une décennie, Mme SQL n'a toujours pas de soutien de première classe pour les tuples. Dans la construction de Tuplas est beaucoup plus lisible que son analyse analogue existez." Yep, j'ai atterri ici à cause de cette limitation de MS SQL. Pour toutes les personnes qui se soucie, veuillez voter pour cela ici - Ajoutez de la prise en charge des constructeurs de valeurs de ligne Standard ANSI Connect.Microsoft.com/sqlserver/feedback/Détails/299231/...



2
votes

Une autre alternative consiste à utiliser la concaténation pour rendre votre 2 tuple dans un seul champ: xxx

... Sachez simplement que les mauvaises choses peuvent arriver si A ou B contiennent le délimiteur ' - '


1 commentaires

Cette solution aurait un autre désavantage: l'optimiseur de requête ne peut pas raisonner sur ces expressions et ne peut donc pas optimiser la requête.