0

我想实现以下目标,我有以下查询(就这么简单),

SELECT ENT_ID,TP_ID FROM TC_LOGS WHERE ENT_ID IN (1,2,3,4,5).

现在该表TC_LOGS可能没有 IN 子句中的所有项目。所以假设表TC_LOGS只有1,2。我想比较 IN 子句中的项目,即 1,2,3,4,5 和 1,2(结果集),并得到结果为 FOUND - 1,2 NOT FOUND - 3,4,5。我已经通过在应用程序代码中的结果集上应用 XSL 转换来实现这一点,但我想在查询中实现这一点,我觉得这更像是解决这个问题的一个优雅的解决方案。另外,我尝试了以下查询NVL,只是为了将 FOUND 和 NOT FOUND 项目分开,

SELECT NVL(ENT_ID,"NOT FOUND") FROM TC_LOGS WHERE ENT_ID IN(1,2,3,4,5)

我期待的结果是 1,2,NOT FOUND,NOT FOUND,NOT FOUND

但是上面的查询没有返回任何结果。如果有人可以在这里指导我正确的道路,我将不胜感激。在此先感谢。

4

3 回答 3

2

假设您IN列表中的项目可以(或可以来自)另一个查询,您可以执行类似的操作

WITH src AS (
  SELECT level id
    FROM dual
 CONNECT BY level <= 5)
SELECT nvl(ent_id, 'Not Found' )
  FROM src
       LEFT OUTER JOIN tc_logs ON (src.id = tc_logs.ent_id)

在我的例子中,src查询只是生成数字 1 到 5。您可以轻松地从不同的表中获取该数据,将数字加载到您使用TABLE运算符查询的集合中,将数字加载到您的临时表中查询等,具体取决于IN列表数据的确定方式。

于 2012-10-09T16:29:11.717 回答
0

NVL 不起作用,因为当与 IN 语句不匹配时,不会返回任何值(包括 NULLS)。

你可以做的是这样的:

SELECT NVL(ENT_ID, "NOT FOUND") 
FROM TC_LOGS
RIGHT OUTER JOIN (
   SELECT 1 AS 'TempID' UNION 
   SELECT 2 UNION 
   SELECT 3 UNION
   SELECT 4 UNION 
   SELECT 5) AS Sub ON ENT_ID = TempID

对于没有匹配项的 ENT_ID,外连接将返回 NULLS。请注意,我不是 Oracle 人员,所以我不能保证这种语法是完美的。

于 2012-10-09T16:32:24.663 回答
0

如果您有一个表(让我们使用 table src )包含所有 (1,2,3,4,5) 值,则可以使用完全连接。您也可以使用 (WITH src AS ( SELECT level id FROM dual CONNECT BY level <= 5) 作为 src 表)

         SELECT 
           ent_id,tl.tp_id,src.tp_id 
         FROM 
           src
        FULL JOIN
          tc_logs tl
        USING (ent_id)
        ORDER BY
          ent_id

这是oracle完全加入的网站。http://psoug.org/snippet/Oracle-PL-SQL-ANSI-Joins-FULL-JOIN_738.htm

于 2012-10-09T17:08:49.530 回答