2012-12-26 17 views
8

Tôi đã tạo hai bảng, T1 và T2 với một cột mỗi, abc và xyz tương ứng. Tôi đã chèn 2 hàng (giá trị số 1 và 2) vào mỗi bảng.Xóa câu lệnh - Truy vấn phụ sẽ phát hiện lỗi

Khi tôi chạy lệnh "select abc from t2", nó ném một lỗi nói rằng cột abc không tồn tại trong bảng T2. Tuy nhiên, khi tôi chạy lệnh "delete from t1 where abc in (SELECT abc from t2);", 2 hàng sẽ bị xóa.

Không nên xóa không thành công vì tôi đã sử dụng cùng một câu lệnh không thành công trong truy vấn phụ?

tạo bảng t1 (số abc); --Bảng được tạo

tạo bảng t2 (số xyz); --Bảng được tạo

chèn vào giá trị t1 (1); --Một hàng được chèn

chèn vào giá trị t1 (2); --Một hàng được chèn

chèn vào giá trị t2 (1); --Một hàng được chèn

chèn vào giá trị t2 (2); --Một hàng được chèn

SELECT abc from t2; --ORA-00904 -> Vì cột abc không tồn tại trong t2

xóa từ t1 ở vị trí abc trong (SELECT abc từ t2); --2 hàng xóa

+3

Tôi đoán là vì 'abc' trong câu lệnh' DELETE' có nghĩa là 'abc' trong' t1' – luiges90

+0

hãy thử chạy một truy vấn cuối cùng để xác nhận các hàng được trả về, sau đó bạn sẽ có một ý tưởng tốt hơn mà giá trị abc đã được trả lại –

+0

Cảm ơn câu trả lời của bạn. Khi tôi sử dụng bí danh "xóa từ t1 nơi abc trong (SELECT t2.abc từ t2), nó ném một lỗi. Nhưng nó không nên ném một lỗi ngay cả khi không có điều đó như tôi đã sử dụng" chọn abc từ t2 "? – Orangecrush

Trả lời

11

Nếu bạn sử dụng các tên bảng như bí danh để làm cho cột chắc chắn bảng t2 là nhận được chọn, bạn sẽ nhận được lỗi tức là

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

truy vấn ban đầu của bạn không được thất bại vì nó sử dụng cột abc của bảng t1vì bảng t1 hiển thị trong truy vấn phụ.

1

Câu lệnh Xóa của bạn đang hoạt động vì tên cột abc mà bạn đã sử dụng trong Điều kiện ở đâu. truy vấn phụ đang thực hiện dựa trên cột điều kiện ở đâu, vì chúng tôi không sử dụng tên bí danh bảng.

nếu bạn thấy các truy vấn này

chọn * từ t1 ở đó abc in (SELECT abc từ t2); - nó sẽ cung cấp cho 2 hàng

chọn * từ t1 trong đó abc in (SELECT 1 từ t2); - nó sẽ cung cấp cho 1 hàng

chọn * từ t1 trong đó abc trong (CHỌN 2 từ t2); - nó sẽ lấy hàng thứ 2

chọn * từ t1, tại đó abc trong (SELECT 3 từ t2); - w't get d data

chọn * từ t1 trong đó abc in (SELECT hg từ t2); - Mã định danh không hợp lệ