2012-03-21 10 views
12

mie prove sembrano confermare cheINSERT INTO ... SELECT ... corrisponde sempre ai campi per posizione ordinale?

INSERT INTO a (x, y) SELECT y, x FROM b 

mappe b.y-a.x, vale a dire, i campi sono abbinati solo da posizione ordinale e non per nome. È sempre così, posso fare affidamento su questo comportamento? Sfortunatamente, the documentation non lo specifica (o non l'ho trovato).

+2

Penso che sia sempre ordinale –

+0

Considerare se b non avesse né x né y. Ordinal è l'unica via che ha senso. INSERISCI IN a (x, y) SELECT f, g FROM b – Paparazzi

risposta

12

Ciò è corretto, SQL Server non tenta di eseguire alcuna mappatura dei nomi di colonna poiché è possibile applicare qualsiasi alias ai dati di origine che si desidera. Riferirà sempre la posizione ordinale.

3

Sì. È perché non sta usando la posizione ordinale, è solo risolvendo la query per parti. Innanzitutto seleziona da b, non tenendo conto dei nomi delle colonne, poiché SQL non risolve le cose usando i nomi delle colonne (puoi creare join di nomi di colonne differenti). Quindi aggiungerà i dati a a, nello stesso modo in cui si specifica la selezione in b. In realtà, se si cambia l'ordine, sarà inserito in altro ordine;) ..

+0

+1 "perché non sta usando la posizione ordinale" – onedaywhen

7

Sì, lei ha ragione.

L'ordine dei campi nell'istruzione INSERT INTO non deve corrispondere alla definizione della tabella.

Tuttavia, i nomi di alias/campo di SELECT verranno ignorati ei valori inseriti nei campi denominati dall'istruzione INSERT INTO.

CREATE TABLE test (
    a  AS INT, 
    b  AS INT, 
    c  AS INT 
) 
INSERT INTO 
    test (
    b, 
    c, 
    a 
) 
SELECT 
    1 AS a, 
    2 AS b, 
    3 AS c 

SELECT * FROM test 

a | b | c 
---+---+--- 
3 | 1 | 2