2010-10-31 109 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;