Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Два CTE, их full join и условие дают некорректный результат  [new]
dennis-r
Member

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

Дело было так...

Имеется некая таблица T
+
CREATE TABLE T (
    F1  VARCHAR(10),
    F2  INTEGER
);

INSERT INTO T (F1, F2) VALUES ('A', 1);
INSERT INTO T (F1, F2) VALUES ('B', 1);
INSERT INTO T (F1, F2) VALUES ('C', 1);
INSERT INTO T (F1, F2) VALUES ('B', 2);
INSERT INTO T (F1, F2) VALUES ('C', 2);
INSERT INTO T (F1, F2) VALUES ('D', 2);


В ней находятся данные:
F1F2
A1
B1
C1
B2
C2
D2

Делаю следующий запрос без общего условия:
with
  T1 as (select F1 from T where F2 = 1),
  T2 as (select F1 from T where F2 = 2)
select
  T1.F1 T1_F1,
  T2.F1 T2_F1
from
  T1 full join T2 on T1.F1 = T2.F1

Получаю ожидаемый результат:
T1_F1T2_F1
BB
CC
D
A

Теперь добавляю условие
where T1.F1 is null
, ожидая получить единственную строчку
T1_F1T2_F1
D

... но получаю следующее:
T1_F1T2_F1
B
C
D

Проверялось на 2.5.9.

Традиционные два вопроса: кто виноват? и что делать?

С уважением,
Денис.
22 июн 20, 22:03    [22155496]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
dennis-r,

а с чего ты решил что это не правильно? Сначала произошла фильтрация, а потом соединение.
Для гарантии твоего результата оберни свой исходный запрос в ещё одну CTE
22 июн 20, 22:32    [22155522]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
dennis-r
Member

Откуда:
Сообщений: 218
Симонов Денис
dennis-r,

а с чего ты решил что это не правильно? Сначала произошла фильтрация, а потом соединение.
Для гарантии твоего результата оберни свой исходный запрос в ещё одну CTE
Хм-м. Я как-то думал, что общее условие выполнится для уже объединённых CTE, а получается, что оно "пропихивается" в условия CTE?
Кстати, я проверил это дело в PostgresSQL 9.6 - там получается ожидаемый результат с одной строкой.
22 июн 20, 22:55    [22155538]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
dennis-r,

вообще эта бага. В 3.0 её поправили, а в 2.5 уже наверное не будут
22 июн 20, 23:01    [22155545]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
dennis-r
Member

Откуда:
Сообщений: 218
Симонов Денис
dennis-r,

вообще эта бага. В 3.0 её поправили, а в 2.5 уже наверное не будут
Грустно это. Проект один пока на 2.5 завязан. А что хоть за баг? Я пока в трекере не нашёл чего-то похожего.
22 июн 20, 23:05    [22155551]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
dennis-r,

я помню что-то правили насчёт FULL JOIN, но номер тикета не скажу. Проверил в 3.0.5 и 4.0 Beta2 результат ожидаемый.
22 июн 20, 23:16    [22155559]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
dennis-r
Member

Откуда:
Сообщений: 218
Симонов Денис,

Проверил в 3.0.5 - да, там работает, как и ожидалось.
Теперь осталось придумать, как эту проблему обойти в 2.5.
22 июн 20, 23:19    [22155564]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
hvlad
Member

Откуда:
Сообщений: 10961
dennis-r
Теперь осталось придумать, как эту проблему обойти в 2.5.
Не делать full join там, где он не нужен ?
22 июн 20, 23:21    [22155565]     Ответить | Цитировать Сообщить модератору
 Re: Два CTE, их full join и условие дают некорректный результат  [new]
dennis-r
Member

Откуда:
Сообщений: 218
hvlad
Не делать full join там, где он не нужен ?
Сравниваются табличные части документов, ищутся различающиеся строки. Если они сравниваются только по одной колонке (ссылка на справочник), то вылазит описанная проблема. Если же есть дополнительные условия (сравнения по нескольким колонкам), то работает нормально.
22 июн 20, 23:38    [22155575]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить