2013-04-09 3 views
4
create table Mytable1 
(ID int, 
Fname varchar(50) 
) 

create table Mytable2 
(ID int, 
Lname varchar(50) 
) 

insert into Mytable1 (ID,Fname) 
values (1,'you') 
insert into Mytable1 (ID,Fname) 
values (2,'Tou') 
insert into Mytable1 (ID,Fname) 
values (3,'Nou') 

insert into Mytable2 (ID,Lname) 
values (1,'you2') 

Поле Fname не существует в таблице Mytable2 Но у нас есть результат для следующего запроса:Это ошибка в SQL Server 2008?

select * from Mytable1 where Fname in (select Fname from Mytable2) 

Примечание: Я использую SQL Server 2008 результат все строки таблицы Mytable1

это ошибка в SQL?

+2

Что RDBMS вы используете? –

+0

Результат будет пустым рядом? –

+0

Я могу воспроизвести это в MySQL. Это жуткий. – mrks

ответ

6

Нет, это не ошибка.

Вы можете увидеть, что происходит немного яснее, если добавить таблицу псевдонимов полей, используемых в запросе:

select * from Mytable1 mt1 
where mt1.Fname in (select mt1.Fname from Mytable2 mt2) 

- то есть. подзапрос ссылается (и возвращает) значения из основного запроса.

Если изменить запрос:

select * from Mytable1 mt1 
where mt1.Fname in (select mt2.Fname from Mytable2 mt2) 

- вы получите сообщение об ошибке.

(SQLFiddle here)

+0

Спасибо, , но в любом случае я думаю, что это источник двусмысленности. –

+0

@MazenKhoder: не имея возможности ссылаться на столбцы из основного запроса внутри подзапроса, коррелированные подзапросы невозможны. Единственная амбивалентность исходит не от имени/псевдонима таблицы с именем столбца. –

+0

так, разве sql не предупредил меня об этой двусмысленности? –

0

Нет, это не ошибка: http://bugs.mysql.com/bug.php?id=26801

По-видимому, это ссылается Fname из Mytable1:

mysql> select *, (select Lname from Mytable1 limit 1) from Mytable2 where Lname in (select Lname from Mytable1); 
+------+-------+--------------------------------------+ 
| ID | Lname | (select Lname from Mytable1 limit 1) | 
+------+-------+--------------------------------------+ 
| 1 | you2 | you2         | 
+------+-------+--------------------------------------+ 
1 row in set (0.01 sec) 
+0

@MahmoudGamal - Не имеет значения. Он также применяется для SQL Server. – Oded

+0

Не имеет значения, поскольку это похоже на стандартную вещь SQL. – mrks

+0

@MahmoudGamal изменить ваш запрос как 'выбрать * из Mytable1 AS t1 где t1.Fname в (выберите t2.Fname из Mytable2 AS t2)', и это даст ошибку –