Почему эта комбинация ROWNUM <=, левого внешнего соединения и подзапросов иногда дает ноль - PullRequest
0 голосов
/ 06 июня 2019

У меня есть автоматически сгенерированный SQL, аналогичный приведенному ниже, я попытался немного упростить его, чтобы продемонстрировать суть проблемы, с которой я сталкиваюсь.Customer.Id - это VARCHAR2 (40 байт), а Order.CustomerId - это число (10,0)

SELECT *
FROM 
(
    SELECT query.*, ROWNUM ROWNUM__
    FROM 
    (
        SELECT cst.name, cst.lastname, ord.product, ord.price
        FROM Customer cst
        LEFT OUTER JOIN Order ord ON ord.Manufacturer = 'Samsung'
        AND TO_CHAR(cst.Id) = TO_CHAR(ord.CUSTOMER_ID)
    ) query
    WHERE ROWNUM <= 1000
)
WHERE ROWNUM__ > 0

. Когда я запускаю самый внутренний запрос, я получаю ожидаемые результаты, нопроблема у меня заключается в том, что при запуске все вместе, LEFT OUTER JOIN возвращает нулевые столбцы.Если я уберу нижеследующее «предложение условия», то это сработает, но, к сожалению, функциональность подкачки обрабатывается библиотекой, созданной моим рабочим местом, и ее использование является обязательным, поэтому изменение этих критериев ROWNUM для меня не вариант.

WHERE ROWNUM <= 1000

Если я удаляю это, это работает, но мне нужно иметь возможность присоединиться по идентификатору таблицы.

TO_CHAR(cst.Id) = TO_CHAR(ord.CUSTOMER_ID)

Если это поможет, план выполнения:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...