Je me demande si cela est possible en SQL. Supposons que vous ayez deux tables A et B, que vous effectuez une sélection sur la table A et que vous vous joignez à la table B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Si la table A contient les colonnes 'a_id', 'name' et 'some_id' et que la table B a 'b_id', 'name' et 'some_id', la requête renvoie les colonnes 'a_id', 'name', 'some_id ',' b_id ',' name ',' some_id '. Existe-t-il un moyen de préfixer les noms de colonne du tableau B sans répertorier chaque colonne individuellement? L'équivalent de ceci:
SELECT a.*, b.b_id as 'b.b_id', b.name as 'b.name', b.some_id as 'b.some_id'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Mais, comme mentionné, sans répertorier chaque colonne, quelque chose comme:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Fondamentalement, quelque chose à dire, "préfixez chaque colonne retournée par b. * Avec" quelque chose "". Est-ce possible ou n'ai-je pas de chance?
Merci d'avance pour votre aide!
EDIT: des conseils pour ne pas utiliser SELECT * et ainsi de suite sont des conseils valides mais non pertinents dans mon contexte, veuillez donc vous en tenir au problème en cours - est-il possible d'ajouter un préfixe (une constante spécifiée dans la requête SQL) à tous les noms de colonne d'une table dans une jointure?
EDIT: mon objectif ultime est de pouvoir faire un SELECT * sur deux tables avec une jointure, et être capable de dire, à partir des noms des colonnes que j'obtiens dans mon jeu de résultats, quelles colonnes proviennent de la table A et quelles colonnes sont venues du tableau B. Encore une fois, je ne veux pas avoir à lister les colonnes individuellement, je dois pouvoir faire un SELECT *.
Réponses:
Je vois deux situations possibles ici. Tout d'abord, vous voulez savoir s'il existe une norme SQL pour cela, que vous pouvez utiliser en général quelle que soit la base de données. Non, il n'y en a pas. Deuxièmement, vous voulez connaître un produit dbms spécifique. Ensuite, vous devez l'identifier. Mais j'imagine que la réponse la plus probable est que vous récupérerez quelque chose comme "a.id, b.id" car c'est ainsi que vous auriez besoin d'identifier les colonnes de votre expression SQL. Et le moyen le plus simple de découvrir la valeur par défaut est simplement de soumettre une telle requête et de voir ce que vous obtenez en retour. Si vous voulez spécifier quel préfixe vient avant le point, vous pouvez utiliser "SELECT * FROM a AS my_alias", par exemple.
la source
Il semble que la réponse à votre question soit non, mais un hack que vous pouvez utiliser consiste à attribuer une colonne factice pour séparer chaque nouvelle table. Cela fonctionne particulièrement bien si vous parcourez un ensemble de résultats pour une liste de colonnes dans un langage de script tel que Python ou PHP.
Je sais que cela ne répond pas exactement à votre question, mais si vous êtes un codeur, c'est un excellent moyen de séparer les tableaux avec des noms de colonne en double. J'espère que cela aide quelqu'un.
la source
Je comprends parfaitement pourquoi cela est nécessaire - au moins pour moi, c'est pratique lors du prototypage rapide quand il y a beaucoup de tables nécessaires à joindre, y compris de nombreuses jointures internes. Dès qu'un nom de colonne est le même dans un deuxième caractère générique de champ "jointable. *", Les valeurs de champ de la table principale sont remplacées par les valeurs de jointable. Sujet aux erreurs, frustrant et une violation de DRY lorsque vous devez spécifier manuellement les champs de la table avec des alias encore et encore ...
Voici une fonction PHP (Wordpress) pour y parvenir grâce à la génération de code avec un exemple d'utilisation. Dans l'exemple, il est utilisé pour générer rapidement une requête personnalisée qui fournira les champs d'une publication wordpress associée référencée via un champ de champs personnalisés avancé .
Le résultat:
la source
La seule base de données que je connais qui le fait est SQLite, selon les paramètres que vous configurez avec
PRAGMA full_column_names
etPRAGMA short_column_names
. Voir http://www.sqlite.org/pragma.htmlSinon, tout ce que je peux recommander est de récupérer les colonnes dans un jeu de résultats par position ordinale plutôt que par nom de colonne, si c'est trop difficile pour vous de taper les noms des colonnes dans votre requête.
Ceci est un bon exemple des raisons pour lesquelles c'est une mauvaise pratique d'utiliser
SELECT *
- car vous aurez finalement besoin de taper tous les noms de colonne de toute façon.Je comprends la nécessité de prendre en charge les colonnes qui peuvent changer de nom ou de position, mais l'utilisation de caractères génériques rend cela plus difficile , pas plus facile.
la source
full_column_names
etshort_column_names
sont déconseillés dans SQLite.Je suis en quelque sorte le même bateau que OP - j'ai des dizaines de champs de 3 tables différentes que je rejoins, dont certains ont le même nom (ie. Id, nom, etc.). Je ne veux pas lister chaque champ, donc ma solution était d'alias ces champs qui partageaient un nom et d'utiliser select * pour ceux qui ont un nom unique.
Par exemple :
table a: id, nom, champ1, champ2 ...
table b: id, nom, champ3, champ4 ...
sélectionnez a.id comme aID, a.name comme aName, a. *, b.id comme bID, b.name comme bName, b. * .....
Lorsque j'accède aux résultats, je nous donne les noms alias de ces champs et j'ignore les noms "d'origine".
Peut-être pas la meilleure solution mais ça marche pour moi .... j'utilise mysql
la source
Différents produits de base de données vous donneront différentes réponses; mais vous vous préparez à vous blesser si vous allez très loin. Vous feriez bien mieux de choisir les colonnes que vous voulez et de leur donner vos propres alias afin que l'identité de chaque colonne soit claire et que vous puissiez les distinguer dans les résultats.
la source
Cette question est très utile dans la pratique. Il suffit de répertorier toutes les colonnes explicites de la programmation logicielle, où vous faites particulièrement attention à faire face à toutes les conditions.
Imaginez lors du débogage, ou essayez d'utiliser le SGBD comme outil bureautique quotidien, au lieu d'une implémentation modifiable de l'infrastructure sous-jacente abstraite d'un programmeur spécifique, nous devons coder beaucoup de SQL. Le scénario peut être trouvé partout, comme la conversion de base de données, la migration, l'administration, etc. La plupart de ces SQL ne seront exécutés qu'une seule fois et ne seront plus jamais utilisés, car le nom de chaque colonne n'est qu'une perte de temps. Et n'oubliez pas que l'invention de SQL n'est pas réservée aux seuls programmeurs.
Habituellement, je vais créer une vue utilitaire avec des noms de colonnes préfixés, voici la fonction en pl / pgsql, ce n'est pas facile mais vous pouvez la convertir dans d'autres langages de procédure.
Exemples:
la source
Je comprends parfaitement votre problème concernant les noms de champs dupliqués.
J'en avais aussi besoin jusqu'à ce que je code ma propre fonction pour le résoudre. Si vous utilisez PHP, vous pouvez l'utiliser ou coder le vôtre dans la langue que vous utilisez si vous disposez des fonctionnalités suivantes.
L'astuce ici est de
mysql_field_table()
renvoyer le nom de la table etmysql_field_name()
le champ pour chaque ligne du résultat s'il est obtenu avecmysql_num_fields()
afin que vous puissiez les mélanger dans un nouveau tableau.Cela préfixe toutes les colonnes;)
Cordialement,
la source
Il n'y a pas de standard SQL pour cela.
Cependant, avec la génération de code (soit à la demande lorsque les tables sont créées ou modifiées ou au moment de l'exécution), vous pouvez le faire assez facilement:
la source
Il y a deux façons dont je peux penser pour que cela se produise de manière réutilisable. L'une consiste à renommer toutes vos colonnes avec un préfixe pour la table dont elles proviennent. Je l'ai vu plusieurs fois, mais je n'aime vraiment pas ça. Je trouve que c'est redondant, cause beaucoup de dactylographie et vous pouvez toujours utiliser des alias lorsque vous avez besoin de couvrir le cas d'un nom de colonne dont l'origine n'est pas claire.
L'autre façon, que je vous recommanderais de faire dans votre situation si vous vous engagez à le voir, est de créer des vues pour chaque table qui alias les noms de table. Ensuite, vous vous associez à ces vues, plutôt qu'aux tables. De cette façon, vous êtes libre d'utiliser * si vous le souhaitez, libre d'utiliser les tables d'origine avec les noms de colonnes d'origine si vous le souhaitez, et cela facilite également l'écriture de toutes les requêtes suivantes, car vous avez déjà effectué le changement de nom dans les vues.
Enfin, je ne comprends pas pourquoi vous devez savoir de quelle table provient chacune des colonnes. Est-ce important? En fin de compte, ce qui importe, ce sont les données qu'elles contiennent. Que UserID provienne de la table User ou de la table UserQuestion n'a pas vraiment d'importance. Cela importe, bien sûr, lorsque vous devez le mettre à jour, mais à ce stade, vous devez déjà bien connaître votre schéma pour le déterminer.
la source
Ou vous pouvez utiliser Red Gate SQL Refactor ou SQL Prompt, qui étend votre SELECT * en listes de colonnes en cliquant sur le bouton Tab
donc dans votre cas, si vous tapez SELECT * FROM A JOIN B ... Allez à la fin de *, bouton Tab, le tour est joué! vous verrez SELECT A.column1, A.column2, ...., B.column1, B.column2 FROM A JOIN B
Ce n'est pas gratuit cependant
la source
Impossible de le faire sans alias, simplement parce que, comment allez-vous référencer un champ dans la clause where, si ce champ existe dans les 2 ou 3 tables que vous joignez? Il ne sera pas clair pour mysql lequel vous essayez de référencer.
la source
J'ai résolu un problème similaire en renommant les champs dans les tables impliquées. Oui, j'ai eu le privilège de le faire et je comprends que tout le monde peut ne pas l'avoir. J'ai ajouté un préfixe à chaque champ d'une table représentant le nom de la table. Ainsi, le SQL affiché par OP resterait inchangé -
et donne toujours les résultats attendus - facilité d'identifier à quelle table les champs de sortie appartiennent.
la source
select * entraîne généralement un mauvais code, car de nouvelles colonnes ont tendance à être ajoutées ou l'ordre des colonnes change dans les tableaux assez fréquemment, ce qui brise généralement select * de manière très subtile. La liste des colonnes est donc la bonne solution.
Quant à la façon de faire votre requête, vous n'êtes pas sûr de mysql, mais dans sqlserver, vous pouvez sélectionner les noms de colonnes dans syscolumns et créer dynamiquement la clause select.
la source
Si vous êtes préoccupé par les modifications de schéma, cela peut fonctionner pour vous: 1. Exécutez une requête 'DESCRIBE table' sur toutes les tables impliquées. 2. Utilisez les noms de champ renvoyés pour construire dynamiquement une chaîne de noms de colonne préfixée avec votre alias choisi.
la source
Il y a une réponse directe à votre question pour ceux qui utilisent la MySQL C-API.
Étant donné le SQL:
Les résultats de 'mysql_stmt_result_metadata ()' donnent la définition de vos champs à partir de votre requête SQL préparée dans la structure MYSQL_FIELD []. Chaque champ contient les données suivantes:
Notez les champs: catalogue, table, org_name
Vous savez maintenant quels champs de votre SQL appartiennent à quel schéma (ou catalogue) et table. Cela suffit pour identifier génériquement chaque champ à partir d'une requête SQL multi-tables, sans avoir à alias quoi que ce soit.
Un produit réel SqlYOG est montré pour utiliser ces données exactes dans un tel manoir qu'ils sont capables de mettre à jour indépendamment chaque table d'une jointure multi-table, lorsque les champs PK sont présents.
la source
À partir de cette solution , voici comment j'aborderais le problème:
Créez d'abord une liste de toutes les
AS
instructions:Ensuite, utilisez-le dans votre requête:
Cependant, cela peut nécessiter des modifications car quelque chose de similaire n'est testé que dans SQL Server. Mais ce code ne fonctionne pas exactement dans SQL Server car USING n'est pas pris en charge.
Veuillez commenter si vous pouvez tester / corriger ce code, par exemple pour MySQL.
la source
J'ai récemment rencontré ce problème dans NodeJS et Postgres.
Approche ES6
Je ne connais aucune fonctionnalité SGBDR qui offre cette fonctionnalité, j'ai donc créé un objet contenant tous mes champs, par exemple:
Défini un réducteur pour concaténer les chaînes avec un nom de table:
Cela renvoie un tableau de chaînes. Appelez-le pour chaque tableau et combinez les résultats:
Générez la dernière instruction SQL:
la source
J'ai implémenté une solution basée sur la réponse suggérant d'utiliser des colonnes factices ou sentinelles dans le nœud. Vous l'utiliseriez en générant du SQL comme:
Et puis post-traiter la ligne que vous récupérez à partir de votre pilote de base de données comme
addPrefixes(row)
.Implémentation (basée sur le
fields
/rows
retourné par mon pilote, mais devrait être facile à changer pour les autres pilotes de base de données):Tester:
la source
Ce que je fais, c'est utiliser Excel pour concaténer la procédure. Par exemple, je sélectionne d'abord * et récupère toutes les colonnes, les colle dans Excel. Ensuite, écrivez le code dont j'ai besoin pour entourer la colonne. Supposons que je devais publier un aperçu de plusieurs colonnes. J'aurais mes champs dans la colonne a et "as prev_" dans la colonne B et mes champs à nouveau dans la colonne c. Dans la colonne d, j'aurais une colonne.
Utilisez ensuite concatanate dans la colonne e et fusionnez-les ensemble, en veillant à inclure des espaces. Ensuite, coupez et collez cela dans votre code SQL. J'ai également utilisé cette méthode pour faire des déclarations de cas pour le même champ et d'autres codes plus longs que je dois faire pour chaque champ dans une table de plusieurs centaines de champs.
la source
En postgres, j'utilise les fonctions json pour renvoyer à la place des objets json .... puis, après une requête, je json_decode les champs avec un suffixe _json.
C'EST À DIRE:
puis en PHP (ou tout autre langage), je fais une boucle dans les colonnes retournées et json_decode () si elles ont le suffixe "_json" (en supprimant également le suffixe. Au final, j'obtiens un objet appelé "tab1" qui inclut tous les champs tab1 et un autre appelé "tab2" qui inclut tous les champs tab2.
la source
PHP 7.2 + MySQL / Mariadb
MySQL vous enverra plusieurs champs du même nom. Même dans le client terminal. Mais si vous voulez un tableau associatif, vous devrez créer les clés vous-même.
Merci à @axelbrz pour l'original. Je l'ai porté sur un php plus récent et l'ai nettoyé un peu:
la source