Sql 比较“in”子句和结果集中的项
我想实现如下目标,我有如下简单的查询:Sql 比较“in”子句和结果集中的项,sql,oracle,Sql,Oracle,我想实现如下目标,我有如下简单的查询: 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进行比较,得到一个结果,即发现-1,2未发现-3,4,5。我已经通过在应用程序代码中的结果集上应用XSL转换实现了这一点,但我希望通过查询实现这一点,我觉得这是解决这个问题的一个更优雅的解
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进行比较,得到一个结果,即发现-1,2未发现-3,4,5。我已经通过在应用程序代码中的结果集上应用XSL转换实现了这一点,但我希望通过查询实现这一点,我觉得这是解决这个问题的一个更优雅的解决方案。另外,我用NVL尝试了以下查询,只是为了将已找到和未找到的项分开
SELECT NVL(ENT_ID,"NOT FOUND") FROM TC_LOGS WHERE ENT_ID IN(1,2,3,4,5)
我期望结果为1,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。您可以同样轻松地从不同的表中获取数据,将数字加载到使用表运算符查询的集合中,将数字加载到查询的临时表中,取决于IN-list数据的确定方式。NVL不起作用,因为当与IN语句不匹配时,不会返回包括null在内的值 您可以这样做:
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返回空值。注意,我不是Oracle人员,所以我不能保证此语法是完美的。如果您有一个表,让我们使用表src包含所有1,2,3,4,5值,您可以使用完全联接。
您可以使用src作为从dual CONNECT BY level中选择级别id,非常感谢所有的响应。我相信Justin的回复应该是有效的,只要我知道如何在in子句中输入条目。与此同时,我想出了一个解决办法。我正在从dual查询IN子句项,并用我的帖子中的查询进行减号。。
SELECT
ent_id,tl.tp_id,src.tp_id
FROM
src
FULL JOIN
tc_logs tl
USING (ent_id)
ORDER BY
ent_id