2012-07-17 3 views
5

Olası Çoğalt:
Column does not exist in the IN clause, but SQL runsBu SQL kodu neden bir hata oluşturmuyor?

Bugün ise iş yerinde bu bugün tökezledi ve neden aşağıdaki kod üretmek ve hata vermez, yani merak ediyorum?

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) 

Çıktı:

ColumnA 
1 
2 
3 

kolumna #TableB bulunduğunu vermez, hata nasıl üretildiğini geldin? SELECT listesindeki geçerli bir sütundur #TableA ait ColumnA atıfta alt sorgu (SELECT ColumnA FROM #TableB) yılında

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

kullanım takma 'Zaten cevap –

+1

A.ColumnA İÇİNDE' (#TableB B DAN B.ColumnA SEÇ) ve hataları kontrol buraya bakın NEREDEN #TableA A DAN * SEÇ sorular/5076906/sütun-yok-içinde-in-in-in-in-in-the-sql-çalışır –

cevap

10

ColumnA:

@@ VERSION ben bu koşuyorum söylüyor.

Dolayısıyla herhangi bir hata olmasa ve (geçerli bir sütundan farklı ama bir şeyle kolumna yerine yukarıdaki ifadeyi doğrulamak isterseniz size # TableA.ColumnA

ile # TableA.ColumnA karşılaştıran beri üç sıra olsun örneğin ColumnAB) bir hata alacaksınız.

Bunu denerseniz:

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) 

çıkış Msg 207, Düzey 16, State 1, satır

olacak 14
Geçersiz sütun adı 'ColumnAB'. http://stackoverflow.com/:

+4

Çok güzel. Bunu açıklamanın başka bir yolu, SELECT * FROM #TableA WHERE ColumnA IN (SELECT 42 FROM #TableB) 'da açıkça hata yoktur. Alt sorgu bağlamında, ColumnA, 42 gibi, herşeyin cevabı değilse de tanımlanır. –

+0

Kendimi aptal hissediyorum! % 100 doğru, bunu defalarca yaptım, sadece iç sorgunun WHERE deyiminde dış sorgudaki sütunları kullanıyorum. Örneğin : 'için #table t t.Id IN (#table teneke MAX (tIn.Id SEÇ) tIn.Column = t.Column) ' \t \t \t \t * FROM SEÇİMİ Bunu garip bir şekilde fark ettim. –