Oracle Query Join проблема - PullRequest
       5

Oracle Query Join проблема

2 голосов
/ 31 октября 2010

У меня есть таблица Oracle, как показано ниже

Orders
---------
ORDERID
DESCRIPTION
TOTALVALUE
ORDERSTATUS

У меня есть нижеуказанный запрос

select ORDERID,ORDERSTATUS
FROM ORDERS
WHERE ORDERID IN( 1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1020,
                  1030,104,1040,1090,789)

Некоторые orderIDs, упомянутые выше, отсутствуют в таблице заказов. Несмотря на это, я хочу, чтобы идентификаторы заказа появлялись в наборе результатов со статусом null.

Ценю вашу помощь.

Ответы [ 4 ]

7 голосов
/ 31 октября 2010

Что по этому поводу:

SELECT T.COLUMN_VALUE AS ORDERID, ORD.ORDERSTATUS
FROM TABLE(SYS.ODCINUMBERLIST(
        1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1020,1030,104,1040,1090,789
    )) T
LEFT JOIN ORDERS ORD ON ORD.ORDERID = T.COLUMN_VALUE;

Вы также можете заставить его работать, если идентификаторы заказа не фиксированы, а являются параметром. Но решение зависит от того, вызываете ли вы оператор из PL / SQL или из другого языка программирования, такого как C #, Java, PHP и т. Д.

Обновление : SYS.ODCINUMBERLIST - это просто тип таблицы, который уже определен в Oracle. Вы можете использовать свой собственный тип:

CREATE TYPE NUMBER_TABLE_T AS TABLE OF NUMBER;
2 голосов
/ 31 октября 2010

Вы можете использовать CTE в качестве таблицы для orderIds (или сохранить их во временной таблице) и внешнее соединение ваше Orders:

With tmp As (
  Select 1000 As orderId From dual
  Union All
  Select 1001 From dual
  Union All
  ...
)
Select tmp.orderId, o.orderStatus
From tmp
Left Join orders o On ( o.orderId = tmp.orderId )

orderStatus равно NULL, если заказ не найден.

1 голос
/ 31 октября 2010

Вы должны выполнить внешнее соединение, чтобы выполнить что-то вроде этого:

SELECT ORDERID, ORDERSTATUS
FROM (
SELECT 1000 AS ORDERID FROM dual UNION SELECT 1001 FROM dual -- etc
) tmpOrderid
LEFT OUTER JOIN ORDERS O
    ON tmpOrderid.ORDERID = O.ORDERID;

Я никогда не использовал Oracle, но, скорее всего, есть функция, которая может генерировать числа (например, generate_series (1000, 1010) в PostgreSQL).

0 голосов
/ 31 октября 2010

есть еще один трюк в oracle.

SELECT LEVEL + 1000 dt FROM DUAL CONNECT BY LEVEL < (2000 - 1000)

он генерирует набор записей с 1000 строками, которые могут быть оставлены вместе с вашей таблицей.

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