Oracle Query Join问题

时间:2010-10-31 14:53:40

标签: sql oracle oracle10g

我有一个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不在订单表中。尽管如此,我希望orderID出现在结果集中,状态为null。

感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

这个怎么样:

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;

如果订单ID不是固定的,而是参数,您也可以使用它。但解决方案取决于您是从PL / SQL还是从其他编程语言(如C#,Java,PHP等)调用语句。

<强>更新 SYS.ODCINUMBERLIST 只是已在Oracle中定义的表类型。您可以使用自己的类型:

CREATE TYPE NUMBER_TABLE_T AS TABLE OF NUMBER;

答案 1 :(得分:2)

您可以使用CTE作为orderIds的表格(或将其存储到临时表格中),outer join使用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 )

orderStatusNULL,当没有找到订单时。

答案 2 :(得分:1)

你必须做一个外部联接来完成这样的事情:

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,但很可能有一个函数可以生成数字(例如,PostgreSQL中的例如generate_series(1000,1010))。

答案 3 :(得分:0)

在oracle中还有一个技巧。

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

它会生成一个包含1000行的记录集,这些记录集可能会与您的表保持连接。