2012-07-17 45 views
5

thể trùng lặp:
Column does not exist in the IN clause, but SQL runsTại sao mã SQL này không tạo ra lỗi?

tôi stumbled khi ngày hôm nay trong khi tại nơi làm việc ngày hôm nay và tôi đã tự hỏi, tại sao nó rằng mã sau đây không tạo ra và báo lỗi?

CREATE TABLE #TableA (ColumnA VARCHAR(25)) 
CREATE TABLE #TableB (ColumnB VARCHAR(25)) 

INSERT INTO #TableA (ColumnA) VALUES('1') 
INSERT INTO #TableA (ColumnA) VALUES('2') 
INSERT INTO #TableA (ColumnA) VALUES('3') 

INSERT INTO #TableB (ColumnB) VALUES('1') 

SELECT * 
FROM #TableA 
WHERE ColumnA IN(SELECT ColumnA FROM #TableB) 

Output:

ColumnA 
1 
2 
3 

columnA không tồn tại trên #TableB, làm thế nào mà không có lỗi được tạo ra?

@@ VERSION nói với tôi Tôi đang chạy này trong:

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM) 
+1

sử dụng bí danh 'SELECT * TỪ #TableA Một ĐÂU A.ColumnA TRÊN (SELECT B.ColumnA TỪ #TableB B) 'và kiểm tra lỗi –

+1

Đã trả lời, xem tại đây: http://stackoverflow.com/ câu hỏi/5076906/cột-không-không tồn tại-in-the-in-khoản-nhưng-sql-chạy –

Trả lời

10

ColumnA trong subquery (SELECT ColumnA FROM #TableB) đề cập đến ColumnA của #TableA mà là một cột có giá trị trong danh sách SELECT.

Do đó không có lỗi và bạn sẽ có được ba hàng kể từ khi bạn đang so sánh sự # TableA.ColumnA với # TableA.ColumnA

Nếu bạn muốn xác minh tuyên bố trên thay columnA với bất cứ điều gì nhưng khác hơn là một cột hợp lệ (ví dụ ColumnAB), bạn sẽ gặp lỗi.

Nếu bạn cố gắng này:

CREATE TABLE #TableA (ColumnA VARCHAR(25)) 
CREATE TABLE #TableB (ColumnB VARCHAR(25)) 

INSERT INTO #TableA (ColumnA) VALUES('1') 
INSERT INTO #TableA (ColumnA) VALUES('2') 
INSERT INTO #TableA (ColumnA) VALUES('3') 

INSERT INTO #TableB (ColumnB) VALUES('1') 

SELECT * 
FROM #TableA 
WHERE ColumnA IN(SELECT ColumnAB FROM #TableB) 

sản lượng sẽ được

Msg 207, Level 16, State 1, Line 14
tên cột không hợp lệ 'ColumnAB'.

+4

Rất tốt đẹp. Một cách khác để giải thích nó là rõ ràng là không có lỗi trong 'SELECT * FROM #TableA WHERE ColumnA IN (SELECT 42 FROM #TableB)'. Trong ngữ cảnh của truy vấn phụ, ColumnA, như 42, được định nghĩa, nếu không phải là câu trả lời cho mọi thứ. –

+0

Tôi cảm thấy câm! Bạn đúng 100%, tôi đã thực hiện điều này nhiều lần chỉ là tôi đã quen với việc sử dụng các cột từ truy vấn bên ngoài trong mệnh đề WHERE của truy vấn bên trong. Ví dụ: 'SELECT * TỪ #table t ĐÂU t.Id IN (SELECT MAX (tIn.Id) TỪ #table thiếc ĐÂU tIn.Column = t.Column) ' \t \t \t \t Đối một số lý do kỳ lạ tôi thấy điều này một cách khác nhau. –

Các vấn đề liên quan