2010-10-31 125 views
2

我有一个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的结果集中。

感谢您的帮助。

回答

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; 

我从来没有使用甲骨文,但最有可能的,可以产生数字的功能(为例,generate_series(1000, 1010)在PostgreSQL中)。

2

可以使用CTE作为表的orderIds(或将它们存储到一个临时表),并outer joinOrders

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,当没有订单被发现。

0

oracle中还有一个窍门。

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

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

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;