Глюк с not in () или <>
Добавлено: 11 окт 2006, 13:13
Наткнулся случайно на такой глюк:
имеются две таблицы:
CREATE TABLE TEST1 (
TEST1_ID INTEGER NOT NULL,
TEST1_NAME VARCHAR(10)
);
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST1 PRIMARY KEY (TEST1_ID);
CREATE TABLE TEST2 (
TEST2_ID INTEGER NOT NULL,
TEST1_ID INTEGER,
TEST2_NAME VARCHAR(10)
);
ALTER TABLE TEST2 ADD CONSTRAINT PK_TEST2 PRIMARY KEY (TEST2_ID);
ALTER TABLE TEST2 ADD CONSTRAINT FK_TEST2_1 FOREIGN KEY (TEST1_ID) REFERENCES TEST1 (TEST1_ID);
INSERT INTO TEST1 VALUES (1,'11111');
INSERT INTO TEST2 VALUES (1,1,'11111');
INSERT INTO TEST2 VALUES (2,null,'22222');
Запрос
SELECT * FROM Test2 WHERE test2.test1_id not in (1) /*или test2.test1_id <> 1*/ не возвращает ничего
Запрос
SELECT * FROM test2 WHERE test2.test1_id not in (SELECT test1.test1_id FROM test1) возвращает 1 строку (как вроде и должен)
Стоит FireBird 1.5 Classsic
Наверняка с такой фишкой уже сталкивались и эта тема обсуждалась. К сожалению, ничего не нашел (видимо искал плохо).
имеются две таблицы:
CREATE TABLE TEST1 (
TEST1_ID INTEGER NOT NULL,
TEST1_NAME VARCHAR(10)
);
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST1 PRIMARY KEY (TEST1_ID);
CREATE TABLE TEST2 (
TEST2_ID INTEGER NOT NULL,
TEST1_ID INTEGER,
TEST2_NAME VARCHAR(10)
);
ALTER TABLE TEST2 ADD CONSTRAINT PK_TEST2 PRIMARY KEY (TEST2_ID);
ALTER TABLE TEST2 ADD CONSTRAINT FK_TEST2_1 FOREIGN KEY (TEST1_ID) REFERENCES TEST1 (TEST1_ID);
INSERT INTO TEST1 VALUES (1,'11111');
INSERT INTO TEST2 VALUES (1,1,'11111');
INSERT INTO TEST2 VALUES (2,null,'22222');
Запрос
SELECT * FROM Test2 WHERE test2.test1_id not in (1) /*или test2.test1_id <> 1*/ не возвращает ничего
Запрос
SELECT * FROM test2 WHERE test2.test1_id not in (SELECT test1.test1_id FROM test1) возвращает 1 строку (как вроде и должен)
Стоит FireBird 1.5 Classsic
Наверняка с такой фишкой уже сталкивались и эта тема обсуждалась. К сожалению, ничего не нашел (видимо искал плохо).