Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 SQL  [new]
Leonid Vorontsov
Member

Откуда: Рига
Сообщений: 321
Здравствуйте!

Предположим, имеется следующая схема:

create table tab1 ( i1 int );
create table tab2 ( i2 int );

Кажется совершенно логичным, что запрос:

select i2 from tab1;

Даёт ошибку -217 (колонка не найдена). Но кажется совершенно нелогичным, что запрос:

select * from tab2 where i2 not in ( select i2 from tab1 );

выполняется безошибочно... Есть какие-то камментарии?
29 окт 08, 18:28    [6372862]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
Leonid Vorontsov

выполняется безошибочно... Есть какие-то камментарии?


SQL> create table tab1 ( i1 int );
Table created.

SQL> create table tab2 ( i2 int );
Table created.

SQL> select * from tab2 where i2 not in ( select i2 from tab1 );
no rows selected

SQL> disc
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
29 окт 08, 19:54    [6373194]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Выбегалло
Member

Откуда: Scottsdale, AZ, USA
Сообщений: 3795
Leonid Vorontsov
Здравствуйте!

Предположим, имеется следующая схема:

create table tab1 ( i1 int );
create table tab2 ( i2 int );

Кажется совершенно логичным, что запрос:

select i2 from tab1;

Даёт ошибку -217 (колонка не найдена). Но кажется совершенно нелогичным, что запрос:

select * from tab2 where i2 not in ( select i2 from tab1 );

выполняется безошибочно... Есть какие-то камментарии?


баг
29 окт 08, 20:38    [6373329]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
$ psql -U zabbixuser zabbix
Password for user zabbixuser:
Welcome to psql 8.3.1, the PostgreSQL interactive terminal.

zabbix=> create table tab1 ( i1 int );
CREATE TABLE
zabbix=> create table tab2 ( i2 int );
CREATE TABLE
zabbix=> select * from tab2 where i2 not in ( select i2 from tab1 );
i2
----
(0 rows)


Сообщение было отредактировано: 29 окт 08, 21:01
29 окт 08, 20:58    [6373379]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Журавлев Денис
Member

Откуда: St.John,NB,CA
Сообщений: 5532
$ mysql zabbix
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 449695
Server version: 5.0.51a-log SUSE MySQL RPM

mysql> create table tab1 ( i1 int );
Query OK, 0 rows affected (0.14 sec)

mysql> create table tab2 ( i2 int );
Query OK, 0 rows affected (0.07 sec)

mysql> select * from tab2 where i2 not in ( select i2 from tab1 );
Empty set (0.09 sec)


Сообщение было отредактировано: 29 окт 08, 21:00
29 окт 08, 21:00    [6373383]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2897
Блог
Денис, прекрати издеваться над честным народом :)

select * from tab2 where i2 not in ( select i2 from tab1 );
=
select tab2.* from tab2 where tab2.i2 not in ( select tab2.i2 from tab1 );

и независимо от наполнения строками или их отсутствием, результат буит "0 rows" :)

1. "Учите матчасть"
2. Не ленитесь, и всегда пишите алиас столбцам :)
29 окт 08, 22:33    [6373545]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2897
Блог
АнатоЛой
и независимо от наполнения строками или их отсутствием, результат буит "0 rows" :)


Хотя может быть я и погорячился насчёт "всегда" - надо посмотреть на варианты с NULL...

Но такой облом :) (эту фразу можно отнести как к предыдущему предложению, так и к топику в целом :)...
29 окт 08, 22:35    [6373550]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
vasilis
Member

Откуда: Украина, Киев
Сообщений: 2205
Выбегалло
Leonid Vorontsov

select * from tab2 where i2 not in ( select i2 from tab1 );
выполняется безошибочно... Есть какие-то камментарии?

баг

Что, вот так у всех производителей, продемонстрированных Денисом, и баг ?
Скорее всего, "by design", т.е. по стандарту :)

Сообщение было отредактировано: 30 окт 08, 11:59
30 окт 08, 11:57    [6375227]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
vasilis
Member

Откуда: Украина, Киев
Сообщений: 2205
Leonid Vorontsov
Здравствуйте!
Предположим, имеется следующая схема:
create table tab1 ( i1 int );
create table tab2 ( i2 int );
Кажется совершенно логичным, что запрос:
select i2 from tab1;
Даёт ошибку -217 (колонка не найдена). Но кажется совершенно нелогичным, что запрос:
select * from tab2 where i2 not in ( select i2 from tab1 );
выполняется безошибочно... Есть какие-то камментарии?

Логика присутствует, хотя и не такая очевидная.
Во втором случае ведь i2 присутствует (хоть и в другой таблице, но из этого же запроса)
поэтому сработывает принцип неявной подстановки.
Как и в случае неявного преобразования типов это имеет как свои плюсы, так и минусы.
30 окт 08, 12:11    [6375353]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить