Gostaria de saber se isso é possível no SQL. Digamos que você tenha duas tabelas A e B e faça uma seleção na tabela A e participe da tabela B:
SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Se a tabela A tiver as colunas 'a_id', 'name' e 'some_id' e a tabela B tiver 'b_id', 'name' e 'some_id', a consulta retornará as colunas 'a_id', 'name', 'some_id ',' b_id ',' nome ',' some_id '. Existe alguma maneira de prefixar os nomes das colunas da tabela B sem listar todas as colunas individualmente? O equivalente a isso:
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);
Mas, como mencionado, sem listar todas as colunas, algo como:
SELECT a.*, b.* as 'b.*'
FROM TABLE_A a JOIN TABLE_B b USING (some_id);
Basicamente, algo a dizer: "prefixe cada coluna retornada por b. * Com 'something'". Isso é possível ou estou sem sorte?
Agradeço antecipadamente por sua ajuda!
EDIT: conselhos sobre o não uso de SELECT * e assim por diante são conselhos válidos, mas não relevantes no meu contexto, portanto, atenha-se ao problema em questão - é possível adicionar um prefixo (uma constante especificada na consulta SQL) a todos os nomes de colunas de uma tabela em uma junção?
EDIT: meu objetivo final é poder fazer um SELECT * em duas tabelas com uma junção e ser capaz de distinguir, pelos nomes das colunas que recebo no meu conjunto de resultados, quais colunas vieram da tabela A e quais colunas vieram da tabela B. Novamente, não quero listar colunas individualmente, preciso poder fazer um SELECT *.
Respostas:
Eu vejo duas situações possíveis aqui. Primeiro, você deseja saber se existe um padrão SQL para isso, que você pode usar em geral, independentemente do banco de dados. Não, não há. Segundo, você deseja saber sobre um produto dbms específico. Então você precisa identificá-lo. Mas imagino que a resposta mais provável é que você receberá algo como "a.id, b.id", pois é assim que você precisa identificar as colunas na sua expressão SQL. E a maneira mais fácil de descobrir qual é o padrão é enviar uma consulta e ver o que você recebe de volta. Se você deseja especificar qual prefixo vem antes do ponto, pode usar "SELECT * FROM a AS my_alias", por exemplo.
fonte
Parece que a resposta para sua pergunta é não, no entanto, um truque que você pode usar é atribuir uma coluna fictícia para separar cada nova tabela. Isso funciona especialmente bem se você estiver percorrendo um conjunto de resultados para uma lista de colunas em uma linguagem de script como Python ou PHP.
Sei que isso não responde exatamente à sua pergunta, mas se você é um codificador, é uma ótima maneira de separar tabelas com nomes de colunas duplicados. Espero que isso ajude alguém.
fonte
Entendo perfeitamente por que isso é necessário - pelo menos para mim é útil durante a prototipagem rápida, quando há muitas tabelas necessárias para unir, incluindo muitas junções internas. Assim que o nome de uma coluna é o mesmo em um segundo curinga do campo "tabela unida. *", Os valores do campo da tabela principal são substituídos pelos valores da tabela unida. Propenso a erros, frustrante e uma violação de DRY ao precisar especificar manualmente os campos da tabela com aliases repetidas vezes ...
Aqui está uma função PHP (Wordpress) para conseguir isso através da geração de código, juntamente com um exemplo de como usá-lo. No exemplo, é usado para gerar rapidamente uma consulta personalizada que fornecerá os campos de uma postagem relacionada do wordpress que foi referenciada através de um campo avançado de campos personalizados .
A saída:
fonte
O único banco de dados que conheço que faz isso é o SQLite, dependendo das configurações definidas com
PRAGMA full_column_names
ePRAGMA short_column_names
. Consulte http://www.sqlite.org/pragma.htmlCaso contrário, tudo o que posso recomendar é buscar colunas em um conjunto de resultados pela posição ordinal, e não pelo nome da coluna, se for demais para você digitar os nomes das colunas na sua consulta.
Este é um bom exemplo de por que é uma má prática usar
SELECT *
- porque, eventualmente, você precisará digitar todos os nomes de colunas de qualquer maneira.Entendo a necessidade de oferecer suporte a colunas que podem mudar de nome ou posição, mas o uso de curingas torna isso mais difícil , não mais fácil.
fonte
full_column_names
eshort_column_names
estão obsoletos no SQLite.Estou no mesmo tipo de barco que o OP - tenho dezenas de campos de 3 tabelas diferentes às quais estou entrando, alguns dos quais têm o mesmo nome (por exemplo, id, nome, etc.). Como não quero listar cada campo, minha solução foi usar o alias dos campos que compartilhavam um nome e usar select * para aqueles que têm um nome exclusivo.
Por exemplo :
tabela a: id, nome, campo1, campo2 ...
tabela b: id, nome, campo3, campo4 ...
selecione a.id como aID, a.name como aName, a. *, b.id como lance, b.name como bName, b. * .....
Ao acessar os resultados, utilizamos os nomes alternativos desses campos e ignoramos os nomes "originais".
Talvez não seja a melhor solução, mas funciona para mim .... eu uso mysql
fonte
Produtos de banco de dados diferentes fornecerão respostas diferentes; mas você está se machucando se levar isso muito longe. É muito melhor escolher as colunas que deseja e dar a eles seus próprios aliases para que a identidade de cada coluna seja clara e você possa diferenciá-los nos resultados.
fonte
Esta questão é muito útil na prática. Só é necessário listar todas as colunas explícitas na programação de software, nas quais você deve ter cuidado especial ao lidar com todas as condições.
Imagine ao depurar ou, tente usar o DBMS como ferramenta diária de escritório, em vez de algo implementável na infraestrutura subjacente abstrata de um programador específico, precisamos codificar muitos SQLs. O cenário pode ser encontrado em qualquer lugar, como conversão de banco de dados, migração, administração, etc. A maioria desses SQLs será executada apenas uma vez e nunca mais será usada. Dê nomes a todas as colunas como perda de tempo. E não esqueça que a invenção do SQL não é apenas para uso dos programadores.
Normalmente, criarei uma exibição de utilitário com nomes de colunas prefixados; aqui está a função no pl / pgsql, não é fácil, mas você pode convertê-lo para outras linguagens de procedimentos.
Exemplos:
fonte
Entendo perfeitamente o seu problema sobre nomes de campos duplicados.
Eu também precisava disso até codificar minha própria função para resolvê-la. Se você estiver usando PHP, poderá usá-lo ou codificar o seu no idioma para o qual está usando, se tiver os seguintes recursos.
O truque aqui é que
mysql_field_table()
retorna o nome da tabela emysql_field_name()
o campo para cada linha no resultado, se houver,mysql_num_fields()
para que você possa misturá-los em uma nova matriz.Isso prefixa todas as colunas;)
Saudações,
fonte
Não existe um padrão SQL para isso.
No entanto, com a geração de código (sob demanda, à medida que as tabelas são criadas ou alteradas ou em tempo de execução), você pode fazer isso facilmente:
fonte
Existem duas maneiras em que posso fazer isso acontecer de maneira reutilizável. Uma é renomear todas as suas colunas com um prefixo para a tabela da qual elas vieram. Eu já vi isso muitas vezes, mas realmente não gosto. Acho que é redundante, causa muita digitação e você sempre pode usar aliases quando precisar cobrir o caso de um nome de coluna com uma origem pouco clara.
A outra maneira, que eu recomendaria que você fizesse na sua situação, se você se comprometer a ver isso, é criar visualizações para cada tabela que aliasse os nomes das tabelas. Então você se junta a essas visualizações, e não às tabelas. Dessa forma, você é livre para usar *, se desejar, livre para usar as tabelas originais com nomes de colunas originais, se desejar, e também facilita a gravação de consultas subseqüentes, porque você já fez o trabalho de renomeação nas visualizações.
Por fim, não estou claro por que você precisa saber de qual tabela cada uma das colunas veio. Isso importa? Em última análise, o que importa são os dados que eles contêm. Se o UserID veio da tabela User ou da tabela UserQuestion, realmente não importa. É importante, é claro, quando você precisar atualizá-lo, mas nesse momento você já deve conhecer seu esquema o suficiente para determinar isso.
fonte
Ou você pode usar o Red Gate SQL Refactor ou o SQL Prompt, que expande seu SELECT * em listas de colunas com um clique no botão Tab
portanto, no seu caso, se você digitar SELECT * FROM A JOIN B ... Vá para o final de *, botão Tab, voila! você verá SELECT A.column1, A.column2, ...., B.column1, B.column2 FROM A JOIN B
Ainda não é grátis
fonte
Não é possível fazer isso sem alias, simplesmente porque, como você fará referência a um campo na cláusula where, se esse campo existir nas 2 ou 3 tabelas em que você está ingressando? Não será claro para o mysql qual você está tentando referenciar.
fonte
Resolvi um problema semelhante renomeando os campos nas tabelas envolvidas. Sim, tive o privilégio de fazer isso e entendo que todo mundo pode não ter. Adicionei prefixo para cada campo dentro de uma tabela que representa o nome da tabela. Portanto, o SQL postado pelo OP permaneceria inalterado -
e ainda fornecer os resultados esperados - facilidade de identificar a qual tabela os campos de saída pertencem.
fonte
select * geralmente gera código incorreto, pois novas colunas tendem a ser adicionadas ou a ordem das colunas muda nas tabelas com bastante frequência, o que geralmente interrompe o select * de maneiras muito sutis. Portanto, listar as colunas é a solução certa.
Quanto a como fazer sua consulta, não tenho certeza sobre o mysql, mas no sqlserver você pode selecionar nomes de colunas em syscolumns e criar dinamicamente a cláusula select.
fonte
Se estiver preocupado com as alterações do esquema, isso pode funcionar para você: 1. Execute uma consulta 'DESCRIBE table' em todas as tabelas envolvidas. 2. Use os nomes de campo retornados para construir dinamicamente uma sequência de nomes de colunas prefixados com o alias escolhido.
fonte
Há uma resposta direta à sua pergunta para aqueles que usam a MySQL C-API.
Dado o SQL:
Os resultados de 'mysql_stmt_result_metadata ()' fornecem a definição de seus campos da sua consulta SQL preparada na estrutura MYSQL_FIELD []. Cada campo contém os seguintes dados:
Observe os campos: catalog, table, org_name
Agora você sabe quais campos em seu SQL pertencem a qual esquema (também conhecido como catálogo) e tabela. Isso é suficiente para identificar genericamente cada campo de uma consulta sql de várias tabelas, sem a necessidade de criar um alias.
É mostrado que um produto real SqlYOG usa esses dados exatos de tal maneira que eles podem atualizar independentemente cada tabela de uma junção de várias tabelas, quando os campos PK estão presentes.
fonte
Desenvolvendo a partir desta solução , é assim que eu abordaria o problema:
Primeiro, crie uma lista de todas as
AS
instruções:Em seguida, use-o na sua consulta:
No entanto, isso pode precisar de modificações, porque algo semelhante é testado apenas no SQL Server. Mas esse código não funciona exatamente no SQL Server porque USING não é suportado.
Por favor, comente se você pode testar / corrigir este código, por exemplo, MySQL.
fonte
Recentemente, deparei com esse problema no NodeJS e no Postgres.
Abordagem ES6
Não há nenhum recurso RDBMS que eu conheça que forneça essa funcionalidade; portanto, criei um objeto contendo todos os meus campos, por exemplo:
Definiu um redutor para concatenar as seqüências de caracteres junto com um nome de tabela:
Isso retorna uma matriz de seqüências de caracteres. Ligue para cada tabela e combine os resultados:
Saída da instrução SQL final:
fonte
Eu implementei uma solução com base na resposta sugerindo o uso de colunas dummy ou sentinela no nó. Você o usaria gerando SQL como:
E depois o processamento da linha que você retorna do driver do banco de dados, como
addPrefixes(row)
.Implementação (com base no
fields
/rows
retornado pelo meu driver, mas deve ser fácil mudar para outros drivers de banco de dados):Teste:
fonte
O que faço é usar o Excel para concatenar o procedimento. Por exemplo, primeiro eu seleciono * e obtenho todas as colunas, cole-as no Excel. Em seguida, escreva o código necessário para cercar a coluna. Digamos que eu precisei de um anúncio anterior para várias colunas. Eu teria meus campos na coluna a e "como prev_" na coluna B e meus campos novamente na coluna c. Na coluna d eu teria uma coluna.
Em seguida, use concatanate na coluna e e junte-os, certificando-se de incluir espaços. Em seguida, recorte e cole isso no seu código sql. Também usei esse método para fazer declarações de caso para o mesmo campo e outros códigos mais longos que preciso fazer para cada campo em uma tabela de centenas de campos.
fonte
No postgres, uso as funções json para retornar objetos json ... depois de consultar, json_decode os campos com um sufixo _json.
IE:
depois, no PHP (ou em qualquer outra linguagem), percorro as colunas retornadas e json_decode () se elas tiverem o sufixo "_json" (também removendo o sufixo. No final, recebo um objeto chamado "tab1" que inclui todas as campos tab1 e outro chamado "tab2" que inclui todos os campos tab2.
fonte
PHP 7.2 + MySQL / Mariadb
O MySQL enviará vários campos com o mesmo nome. Mesmo no cliente do terminal. Mas se você quiser uma matriz associativa, precisará fazer as chaves sozinho.
Obrigado a @axelbrz pelo original. Eu o levei para o php mais recente e o limpei um pouco:
fonte