我有一个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。
感谢您的帮助。
答案 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 )
orderStatus
是NULL
,当没有找到订单时。
答案 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行的记录集,这些记录集可能会与您的表保持连接。