Estou tentando INSERT INTO
uma tabela usando a entrada de outra tabela. Embora isso seja totalmente viável para muitos mecanismos de banco de dados, sempre me lembro de lembrar a sintaxe correta para o SQL
mecanismo do dia ( MySQL , Oracle , SQL Server , Informix e DB2 ).
Existe uma sintaxe de bala de prata proveniente de um padrão SQL (por exemplo, SQL-92 ) que me permita inserir os valores sem se preocupar com o banco de dados subjacente?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
fonte
fonte
Respostas:
Tentar:
Esse é o padrão ANSI SQL e deve funcionar em qualquer DBMS
Definitivamente funciona para:
fonte
Resposta de Claude Houle : deve funcionar bem, e você também pode ter várias colunas e outros dados:
Eu só usei essa sintaxe com Access, SQL 2000/2005 / Express, MySQL e PostgreSQL, portanto, essas devem ser cobertas. Também deve funcionar com o SQLite3.
fonte
Para obter apenas um valor em um valor múltiplo
INSERT
de outra tabela, fiz o seguinte no SQLite3:fonte
INSERT
é tantoVALUES
ou umaSELECT
afirmação, não ambos.INSERT INTO ... VALUES ([expr], [expr], ...)
e um dos caminhos[expr]
é{{NOT} EXISTS} ([select-stmt])
- nota que o parêntese em torno da instrução SELECT são necessários ({}
ou seja opcional)As duas respostas que eu vejo funcionam bem no Informix especificamente e são basicamente SQL padrão. Ou seja, a notação:
funciona bem com o Informix e, eu esperaria, com todo o DBMS. (Uma vez, há 5 anos ou mais, esse é o tipo de coisa que o MySQL nem sempre suportava; agora possui um suporte decente para esse tipo de sintaxe SQL padrão e, AFAIK, funcionaria bem nessa notação.) A lista de colunas é opcional, mas indica as colunas de destino em sequência; portanto, a primeira coluna do resultado do SELECT entra na primeira coluna listada, etc. Na ausência da lista de colunas, a primeira coluna do resultado do SELECT entra no primeira coluna da tabela de destino.
O que pode ser diferente entre os sistemas é a notação usada para identificar tabelas em diferentes bancos de dados - o padrão não tem nada a dizer sobre operações entre bancos de dados (quanto mais entre DBMS). Com o Informix, você pode usar a seguinte notação para identificar uma tabela:
Ou seja, você pode especificar um banco de dados, identificando opcionalmente o servidor que hospeda esse banco de dados, se ele não estiver no servidor atual, seguido por um proprietário opcional, ponto e, finalmente, o nome da tabela real. O padrão SQL usa o termo esquema para o que o Informix chama de proprietário. Portanto, no Informix, qualquer uma das seguintes notações pode identificar uma tabela:
O proprietário em geral não precisa ser citado; no entanto, se você usar aspas, precisará digitar o nome do proprietário corretamente - ele faz distinção entre maiúsculas e minúsculas. Isso é:
todos identificam a mesma tabela. Com o Informix, há uma complicação leve nos bancos de dados MODE ANSI, em que os nomes dos proprietários geralmente são convertidos em maiúsculas (o Informix é a exceção). Ou seja, em um banco de dados MODE ANSI (normalmente não usado), você pode escrever:
e o nome do proprietário no catálogo do sistema seria "ALGUÉM", em vez de "alguém". Se você colocar o nome do proprietário entre aspas duplas, ele funcionará como um identificador delimitado. Com o SQL padrão, identificadores delimitados podem ser usados em muitos lugares. Com o Informix, você pode usá-los apenas em torno de nomes de proprietários - em outros contextos, o Informix trata cadeias de citação única e dupla como cadeias de caracteres, em vez de separar cadeias de citação única como cadeias e cadeias de citação dupla como identificadores delimitados. (Obviamente, apenas para completar, existe uma variável de ambiente, DELIMIDENT, que pode ser configurada - com qualquer valor, mas Y é mais seguro - para indicar que aspas duplas sempre envolvem identificadores delimitados e aspas simples sempre envolvem seqüências de caracteres.)
Observe que o MS SQL Server consegue usar [identificadores delimitados] entre colchetes. Parece estranho para mim e certamente não faz parte do padrão SQL.
fonte
Para adicionar algo na primeira resposta, quando queremos apenas alguns registros de outra tabela (neste exemplo, apenas um):
fonte
A maioria dos bancos de dados segue a sintaxe básica,
Cada banco de dados Eu tenho usado seguir esta sintaxe ou seja,
DB2
,SQL Server
,MY SQL
,PostgresQL
fonte
Em vez de
VALUES
parte daINSERT
consulta, basta usar aSELECT
consulta como abaixo.fonte
Duas abordagens para inserção na subconsulta selecionada.
1. Abordagem para Com a subconsulta SELECT retornando resultados com uma linha .
Nesse caso, assume que a subconsulta SELECT retorna apenas uma linha de resultado com base na condição WHERE ou nas funções agregadas do SQL como SUM, MAX, AVG etc. Caso contrário, ocorrerá um erro
2. Abordagem da subconsulta SELECT retornando resultados com várias linhas .
A segunda abordagem funcionará para ambos os casos.
fonte
Isso pode ser feito sem especificar as colunas da
INSERT INTO
peça, se você estiver fornecendo valores para todas as colunas daSELECT
peça.Digamos que table1 tenha duas colunas. Esta consulta deve funcionar:
Isto NÃO funcionaria (o valor para
col2
não está especificado):Estou usando o MS SQL Server. Não sei como outros RDMS funcionam.
fonte
Este é outro exemplo usando valores com select:
fonte
Inserção simples quando a sequência da coluna da tabela é conhecida:
Coluna de menção de inserção simples:
Inserção em massa quando o número de colunas selecionadas de uma tabela (# table2) é igual à tabela de inserção (Tabela1)
Inserção em massa quando você deseja inserir apenas na coluna desejada de uma tabela (tabela1):
fonte
Aqui está outro exemplo em que a fonte é obtida usando mais de uma tabela:
fonte
Basta usar parênteses para a cláusula SELECT em INSERT. Por exemplo, assim:
fonte
Veja como inserir de várias tabelas. Este exemplo específico é onde você tem uma tabela de mapeamento em um cenário de muitos para muitos:
(Sei que a correspondência com o nome do aluno pode retornar mais de um valor, mas você entendeu. A correspondência com algo diferente de um ID é necessária quando o ID é uma coluna Identidade e é desconhecida.)
fonte
Isso funciona em todos os DBMS
fonte
Você pode tentar isso se quiser inserir todas as colunas usando a
SELECT * INTO
tabela.fonte
Na verdade, eu prefiro o seguinte no SQL Server 2008:
Ele elimina a etapa de adicionar o conjunto Insert () e você apenas seleciona quais valores vão na tabela.
fonte
Isso funcionou para mim:
A frase é um pouco diferente da da Oracle.
fonte
Para o Microsoft SQL Server, recomendo aprender a interpretar o SYNTAX fornecido no MSDN. Com o Google, é mais fácil do que nunca procurar por sintaxe.
Nesse caso em particular, tente
O primeiro resultado será http://msdn.microsoft.com/en-us/library/ms174335.aspx
role para baixo até o exemplo ("Usando as opções SELECT e EXECUTE para inserir dados de outras tabelas") se achar difícil interpretar a sintaxe fornecida na parte superior da página.
Isso deve ser aplicável a qualquer outro RDBMS disponível lá. Não faz sentido lembrar de toda a sintaxe de todos os produtos IMO.
fonte
fonte
Parece bom, mas funciona apenas se tmp não existir (cria e preenche). (Servidor SQL)
Para inserir na tabela tmp existente:
fonte
A melhor maneira de inserir vários registros de outras tabelas.
fonte
Se você seguir a rota INSERT VALUES para inserir várias linhas, delimite os VALUES em conjuntos usando parênteses, portanto:
Caso contrário, os objetos do MySQL que "Contagem de colunas não correspondem à contagem de valores na linha 1", e você acaba escrevendo uma postagem trivial quando finalmente decide o que fazer.
fonte
Se você deseja inserir alguns dados em uma tabela sem escrever o nome da coluna.
Onde estão as tabelas:
Resultado:
fonte
No informix, funciona como Claude disse:
fonte
O Postgres suporta a seguir: crie a tabela company.monitor2 como select * from company.monitor;
fonte