2012-12-26 11 views
8

Ho creato due tabelle, T1 e T2 con una colonna ciascuna, rispettivamente abc e xyz. Ho inserito 2 righe (valori numerici 1 e 2) in ogni tabella.Elimina istruzione - Query secondaria deve generare un errore

Quando si esegue il comando "select abc from t2", viene generato un errore che indica che la colonna abc non esiste nella tabella T2. Tuttavia, quando eseguo il comando "delete from t1 where abc in (SELECT abc from t2);", vengono cancellate 2 righe.

Non dovrebbe fallire l'eliminazione poiché ho utilizzato la stessa istruzione che non è riuscita nella sottoquery?

creare tabella t1 (numero abc); --Tabella creata

creare tabella t2 (numero xyz); --Tabella creata

inserire in valori t1 (1); - Una riga inserita

inserire in valori t1 (2); - Una riga inserita

inserire in valori t2 (1); - Una riga inserita

inserire in valori t2 (2); - Una riga inserita

SELECT abc da t2; --ORA-00904 -> Perché la colonna abc non esiste in t2

eliminare da t1 dove abc in (SELECT abc da t2); --2 righe eliminate

+3

Suppongo che sia dovuto al fatto che 'abc' nell'istruzione' DELETE' significa 'abc' in' t1' – luiges90

+0

provare a eseguire una selezione nell'ultima query per confermare quali sono le righe che vengono restituite, quindi Avremo un'idea migliore che i valori abc sono stati restituiti –

+0

Grazie per le vostre risposte. Quando uso l'alias "cancella da t1 dove abc in (SELEZIONA t2.abc da t2), genera un errore, ma non dovrebbe lanciare un errore anche senza quello in cui ho usato" select abc from t2 "? – Orangecrush

risposta

11

Se si utilizzano i nomi di tabella come alias per rendere sicuri colonna tabella T2 è sempre selezionata, si otterrà l'errore cioè

delete from t1 where abc in (SELECT t2.abc from t2); --ORA-00904 

tua query originale non sta fallendo perché utilizza la colonna abc della tabella t1poiché la tabella t1 è visibile nella sottoquery.

1

L'istruzione Delete funziona a causa del nome della colonna abc che è stato utilizzato nella condizione Where. la query secondaria è in esecuzione in base alla colonna della condizione where, perché non useremo il nome alias della tabella.

se u vedere queste query

select * from t1 dove abc a (SELECT abc da T2); - Fornirà 2 righe

selezionare * da t1 dove abc in (SELECT 1 da t2); - Dare 1 riga

selezionare * da t1 dove abc in (SELECT 2 da t2); - recupera la seconda riga

seleziona * da t1 dove abc in (SELECT 3 da t2); - w't get d data

selezionare * da t1 dove abc in (SELECT hg da t2); - Identificatore non valido

Problemi correlati