我想实现如下内容,我有以下查询(简单如此),
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,未找到,未找到,未找到
但是上面的查询并没有返回任何结果..如果有人可以在这里引导我走上正确的道路,我会很感激..非常感谢。
答案 0 :(得分: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.您可以轻松地从不同的表中获取数据,将数字加载到您使用{{1}查询的集合中运算符,将数字加载到您查询的临时表中,具体取决于TABLE
列表数据的确定方式。
答案 1 :(得分: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人员所以我不能保证这种语法是完美的。
答案 2 :(得分:0)
如果你有一个表(让我们使用表src)包含所有(1,2,3,4,5)值,你可以使用完全连接。 你可以使用(WITH src AS(SELECT level id FROM dual CONNECT BY level&lt; = 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 full join的网站。http://psoug.org/snippet/Oracle-PL-SQL-ANSI-Joins-FULL-JOIN_738.htm