Me pregunto si esto es posible en SQL. Digamos que tiene dos tablas A y B, y hace una selección en la tabla A y se une en la tabla B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Si la tabla A tiene las columnas 'a_id', 'name' y 'some_id', y la tabla B tiene 'b_id', 'name' y 'some_id', la consulta devolverá las columnas 'a_id', 'name', 'some_id ',' b_id ',' name ',' some_id '. ¿Hay alguna forma de prefijar los nombres de columna de la tabla B sin enumerar cada columna individualmente? El equivalente de esto:
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);
Pero, como se mencionó, sin enumerar cada columna, entonces algo como:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Básicamente algo que decir, "prefijo cada columna devuelta por b. * Con 'algo'". ¿Es esto posible o no tengo suerte?
¡Gracias de antemano por tu ayuda!
EDITAR: el consejo sobre no usar SELECT *, etc., es un consejo válido pero no relevante en mi contexto, así que atente al problema en cuestión: ¿es posible agregar un prefijo (una constante especificada en la consulta SQL) a todos los nombres de columna de una tabla en una unión?
EDITAR: mi objetivo final es poder hacer un SELECCIONAR * en dos tablas con una combinación, y poder distinguir, a partir de los nombres de las columnas que obtengo en mi conjunto de resultados, qué columnas vinieron de la tabla A y qué columnas vinieron de la tabla B. Nuevamente, no quiero tener que enumerar columnas individualmente, necesito poder hacer un SELECT *.
Respuestas:
Veo dos posibles situaciones aquí. Primero, desea saber si hay un estándar SQL para esto, que puede usar en general independientemente de la base de datos. No no hay. En segundo lugar, desea saber con respecto a un producto dbms específico. Entonces necesitas identificarlo. Pero imagino que la respuesta más probable es que obtendrá algo así como "a.id, b.id", ya que así es como debería identificar las columnas en su expresión SQL. Y la forma más fácil de averiguar cuál es el valor predeterminado es simplemente enviar una consulta y ver qué se obtiene. Si desea especificar qué prefijo viene antes del punto, puede usar "SELECT * FROM a AS my_alias", por ejemplo.
fuente
Parece que la respuesta a su pregunta es no, sin embargo, un truco que puede usar es asignar una columna ficticia para separar cada nueva tabla. Esto funciona especialmente bien si está recorriendo un conjunto de resultados para una lista de columnas en un lenguaje de script como Python o PHP.
Me doy cuenta de que esto no responde a su pregunta exactamente, pero si es un programador, esta es una excelente manera de separar tablas con nombres de columna duplicados. Espero que esto ayude a alguien.
fuente
Entiendo totalmente por qué esto es necesario, al menos para mí es útil durante la creación rápida de prototipos cuando hay muchas tablas necesarias para unir, incluidas muchas uniones internas. Tan pronto como el nombre de una columna sea el mismo en un segundo comodín de campo "jointable. *", Los valores de campo de la tabla principal se anulan con los valores de tabletable. Propenso a errores, frustrante y una violación de DRY al tener que especificar manualmente los campos de la tabla con alias una y otra vez ...
Aquí hay una función PHP (Wordpress) para lograr esto a través de la generación de código junto con un ejemplo de cómo usarlo. En el ejemplo, se usa para generar rápidamente una consulta personalizada que proporcionará los campos de una publicación de WordPress relacionada a la que se hizo referencia a través de un campo de campos personalizados avanzados .
La salida:
fuente
La única base de datos que sé que hace esto es SQLite, dependiendo de la configuración que configure con
PRAGMA full_column_names
yPRAGMA short_column_names
. Ver http://www.sqlite.org/pragma.htmlDe lo contrario, todo lo que puedo recomendar es buscar columnas en un conjunto de resultados por posición ordinal en lugar de por nombre de columna, si le resulta demasiado difícil escribir los nombres de las columnas en su consulta.
Este es un buen ejemplo de por qué es una mala práctica usarlo
SELECT *
, porque eventualmente tendrá que escribir todos los nombres de columna de todos modos.Entiendo la necesidad de admitir columnas que pueden cambiar el nombre o la posición, pero el uso de comodines hace que sea más difícil , no más fácil.
fuente
full_column_names
yshort_column_names
están en desuso en SQLite.Estoy en el mismo tipo de barco que OP: tengo docenas de campos de 3 tablas diferentes a las que me estoy uniendo, algunos de los cuales tienen el mismo nombre (es decir, id, nombre, etc.). No quiero enumerar cada campo, por lo que mi solución fue crear un alias de los campos que compartían un nombre y usar select * para aquellos que tienen un nombre único.
Por ejemplo :
tabla a: id, nombre, campo1, campo2 ...
tabla b: id, nombre, campo3, campo4 ...
seleccione a.id como aID, a.name como aName, a. *, b.id como bID, b.name como bName, b. * .....
Al acceder a los resultados, uso los nombres con alias para estos campos e ignoro los nombres "originales".
Tal vez no sea la mejor solución, pero funciona para mí ... estoy usando mysql
fuente
Diferentes productos de bases de datos le darán diferentes respuestas; pero te estás preparando para el dolor si llevas esto muy lejos. Es mucho mejor elegir las columnas que desee y darles sus propios alias para que la identidad de cada columna sea clara como el cristal y pueda distinguirlas en los resultados.
fuente
Esta pregunta es muy útil en la práctica. Solo es necesario enumerar todas las columnas explícitas en la programación de software, donde debe prestar especial atención para tratar todas las condiciones.
Imagínese cuando depure, o intente usar DBMS como herramienta diaria de oficina, en lugar de una implementación alterable de la infraestructura subyacente abstracta de un programador específico, necesitamos codificar una gran cantidad de SQL. El escenario se puede encontrar en todas partes, como la conversión de bases de datos, la migración, la administración, etc. La mayoría de estos SQL se ejecutarán solo una vez y nunca se volverán a usar, dado que los nombres de cada columna son solo una pérdida de tiempo. Y no olvide que la invención de SQL no es solo para uso de los programadores.
Por lo general, crearé una vista de utilidad con los nombres de columna prefijados, aquí está la función en pl / pgsql, no es fácil, pero puede convertirla a otros lenguajes de procedimientos.
Ejemplos:
fuente
Entiendo totalmente su problema con los nombres de campo duplicados.
También necesitaba eso hasta que codificara mi propia función para resolverlo. Si está usando PHP, puede usarlo o codificar el suyo en el idioma que está usando si tiene las siguientes facilidades.
El truco aquí es que
mysql_field_table()
devuelve el nombre de la tabla ymysql_field_name()
el campo para cada fila en el resultado si se obtiene conmysql_num_fields()
para que pueda mezclarlos en una nueva matriz.Esto prefija todas las columnas;)
Saludos,
fuente
No hay un estándar SQL para esto.
Sin embargo, con la generación de código (ya sea a pedido a medida que se crean o alteran las tablas o en tiempo de ejecución), puede hacer esto con bastante facilidad:
fuente
Hay dos maneras en que puedo pensar para que esto suceda de una manera reutilizable. Una es renombrar todas las columnas con un prefijo para la tabla de la que provienen. Lo he visto muchas veces, pero realmente no me gusta. Creo que es redundante, causa muchos tipeos y siempre puede usar alias cuando necesite cubrir el caso de un nombre de columna que tiene un origen poco claro.
La otra forma, que recomendaría que haga en su situación si se compromete a hacerlo, es crear vistas para cada tabla que alias los nombres de las tablas. Luego te unes contra esas vistas, en lugar de las tablas. De esa forma, puede usar * si lo desea, usar las tablas originales con los nombres de columna originales si lo desea, y también facilita la escritura de consultas posteriores porque ya ha realizado el trabajo de cambio de nombre en las vistas.
Finalmente, no estoy claro por qué necesita saber de qué tabla provienen cada una de las columnas. ¿Esto importa? En última instancia, lo que importa son los datos que contienen. Si el ID de usuario proviene de la tabla Usuario o de la tabla Pregunta de usuario realmente no importa. Importa, por supuesto, cuando necesita actualizarlo, pero en ese punto ya debe conocer su esquema lo suficientemente bien como para determinarlo.
fuente
O puede usar Red Gate SQL Refactor o SQL Prompt, que expande su SELECT * en listas de columnas con un clic del botón Tabulador
así que en su caso, si escribe SELECT * FROM A JOIN B ... Vaya al final de *, botón Tab, ¡listo! verá SELECT A.column1, A.column2, ...., B.column1, B.column2 DESDE UNIRSE A B
Aunque no es gratis
fuente
No puede hacer esto sin alias, simplemente porque, ¿cómo va a hacer referencia a un campo en la cláusula where, si ese campo existe en las 2 o 3 tablas a las que se une? No estará claro para mysql a cuál está intentando hacer referencia.
fuente
Resolví un problema similar al cambiar el nombre de los campos en las tablas involucradas. Sí, tuve el privilegio de hacer esto y entiendo que es posible que no todos lo tengan. Agregué un prefijo a cada campo dentro de una tabla que representa el nombre de la tabla. Por lo tanto, el SQL publicado por OP permanecería sin cambios:
y aún así dar los resultados esperados: facilidad para identificar a qué tabla pertenecen los campos de salida.
fuente
select * generalmente genera un código incorrecto, ya que las nuevas columnas tienden a agregarse o el orden de las columnas cambia en las tablas con bastante frecuencia, lo que generalmente rompe select * de una manera muy sutil. Por lo tanto, enumerar columnas es la solución correcta.
En cuanto a cómo hacer su consulta, no estoy seguro acerca de mysql, pero en sqlserver puede seleccionar nombres de columna de syscolumns y construir dinámicamente la cláusula select.
fuente
Si le preocupan los cambios de esquema, esto podría funcionar para usted: 1. Ejecute una consulta 'DESCRIBIR tabla' en todas las tablas involucradas. 2. Utilice los nombres de campo devueltos para construir dinámicamente una cadena de nombres de columna con el alias elegido.
fuente
Hay una respuesta directa a su pregunta para aquellos que usan MySQL C-API.
Dado el SQL:
Los resultados de 'mysql_stmt_result_metadata ()' dan la definición de sus campos de su consulta SQL preparada en la estructura MYSQL_FIELD []. Cada campo contiene los siguientes datos:
Tenga en cuenta los campos: catálogo, tabla, nombre_organización
Ahora sabe qué campos en su SQL pertenecen a qué esquema (también conocido como catálogo) y tabla. Esto es suficiente para identificar genéricamente cada campo de una consulta sql de varias tablas, sin tener que alias.
Se muestra que un producto real SqlYOG utiliza estos datos exactos de tal manera que pueden actualizar de forma independiente cada tabla de una combinación de varias tablas, cuando los campos PK están presentes.
fuente
Desarrollando a partir de esta solución , así es como abordaría el problema:
Primero cree una lista de todas las
AS
declaraciones:Luego úselo en su consulta:
Sin embargo, esto podría necesitar modificaciones porque algo similar solo se prueba en SQL Server. Pero este código no funciona exactamente en SQL Server porque USING no es compatible.
Comente si puede probar / corregir este código, por ejemplo, MySQL.
fuente
Recientemente me encontré con este problema en NodeJS y Postgres.
Enfoque ES6
No conozco ninguna característica RDBMS que brinde esta funcionalidad, por lo que creé un objeto que contiene todos mis campos, por ejemplo:
Definió un reductor para concatenar las cadenas junto con un nombre de tabla:
Esto devuelve una serie de cadenas. Llámalo para cada tabla y combina los resultados:
Salida de la declaración SQL final:
fuente
Implementé una solución basada en la respuesta que sugiere el uso de columnas ficticias o centinelas en el nodo. Lo usaría generando SQL como:
Y luego procese la fila que obtiene de su controlador de base de datos como
addPrefixes(row)
.Implementación (basada en
fields
/rows
devuelta por mi controlador, pero debería ser fácil de cambiar para otros controladores de base de datos):Prueba:
fuente
Lo que hago es usar Excel para concatenar el procedimiento. Por ejemplo, primero selecciono * y obtengo todas las columnas, las pego en Excel. Luego escriba el código que necesito para rodear la columna. Digamos que necesitaba un anuncio anterior a un montón de columnas. Tendría mis campos en la columna a y "como prev_" en la columna B y mis campos nuevamente en la columna c. En la columna d tendría una columna.
Luego use concatanate en la columna e y combínelos, asegurándose de incluir espacios. Luego corta y pega esto en tu código sql. También he usado este método para hacer declaraciones de caso para el mismo campo y otros códigos más largos que necesito hacer para cada campo en una tabla de campo de cientos.
fuente
En postgres, uso las funciones json para devolver objetos json ... luego, después de consultar, json_decode los campos con un sufijo _json.
ES DECIR:
luego en PHP (o cualquier otro lenguaje), recorro las columnas devueltas y las json_decode () si tienen el sufijo "_json" (también eliminando el sufijo. Al final, obtengo un objeto llamado "tab1" que incluye todos campos tab1 y otro llamado "tab2" que incluye todos los campos tab2.
fuente
PHP 7.2 + MySQL / Mariadb
MySQL le enviará múltiples campos con el mismo nombre. Incluso en la terminal del cliente. Pero si desea una matriz asociativa, tendrá que hacer las claves usted mismo.
Gracias a @axelbrz por el original. Lo porté a un php más nuevo y lo limpié un poco:
fuente