В устаревшем коде я нашел какой-то странный запрос SQL SELECT, который вызвал ошибку в нашем приложении. Моя версия Oracle 11.2.0.1.0. Ниже (упрощенный) Код:Oracle SQL SELECT неожиданное поведение
DDL:
DROP TABLE A;
DROP TABLE B;
DROP TABLE C;
CREATE TABLE "A"
(
"ID_B" NUMBER NOT NULL
);
CREATE INDEX "A_INDEX" ON "A"("ID_B");
CREATE TABLE "B"
(
"ID" NUMBER NOT NULL,
"NAME" VARCHAR2(50 BYTE),
"SURNAME" VARCHAR2(50 BYTE),
CONSTRAINT "PK_B" PRIMARY KEY ("ID")
);
CREATE TABLE "C"
(
"ID" NUMBER NOT NULL
);
INSERT INTO A(ID_B) VALUES (10);
INSERT INTO B(ID, SURNAME, NAME) VALUES(10, 'LUCKY', 'LUKE');
COMMIT;
ВЫБРАТЬ:
SELECT COUNT(*)
FROM
(
SELECT
B.ID,
B.SURNAME,
B.NAME
FROM A
LEFT JOIN B ON B.ID = A.ID_B
LEFT OUTER JOIN (SELECT * FROM C WHERE ID = 10) C ON 1 = 1
WHERE A.ID_B = 10
);
ПРОБЛЕМА: могли бы вы помочь мне понять, почему выберите COUNT (*) возвращает 0, как результат по суб-запросу возвращает 1 строку результата? Когда я отбрасываю 'A_INDEX', оба выбирают отлично (count (*) возвращает 1).
Пожалуйста, напишите 'EXPLAIN PLAN FOR SELECT ...' для обоих случаев – lad2025
Это ... странно, и он корректно работает с индексом, если вы измените внешнее соединение, чтобы использовать c, id = a.id_b вместо из 1 = 1, которая в любом случае является нечетной конструкцией. –
@ lad2025 мой план выполнения точно такой же, как и ниже –