使用在查询外部选择的字段作为子查询的参数

时间:2016-12-20 15:17:31

标签: sql select oracle11g null correlated-subquery

如何使用在查询外部选择的字段作为子查询的参数?我认为这或多或少是它,但显然不是应该返回几行

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1
AND (
      SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
    ) != NULL

UPDATE 谢谢你到目前为止的所有答案。我应该说,使用EXIST会一直返回true,因为子查询中的行将存在,而不一定是'altref'中的值,所以我修改了EXISTS以在alt ref中包含is not null

4 个答案:

答案 0 :(得分:3)

这里的问题是您使用[in] eqaulity运算符检查nullNull不是一个值 - 它缺乏价值 - 因此,与它的任何价值比较(例如,=!=>等都会返回“未知“(这不是真的,因此不会返回任何返回评估它的行。)

相反,您应该使用IS运算符:

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1
AND (
      SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
    ) IS NOT NULL
-- Here^

值得注意的是,BTW,exists运算符可能更优雅:

SELECT f1, f2, f3
FROM   table1 t1
WHERE  status = 1 AND
       EXISTS (SELECT *
               FROM   table2
               WHERE  altref = SUBSTR(t1.f2, 1, 4))

答案 1 :(得分:2)

试试这个:

SELECT f1, f2, f3
FROM table1 t1
INNER JOIN (
      SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
    ) as table2 on table2.altref = SUBSTR(t1.f2, 1,4)
WHERE status = 1

答案 2 :(得分:1)

您的问题是!= NULL。这总是会导致WHERE子句中的过滤失败(结果将是NULL,这永远不会是真的。)

我想你想要:

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1 AND
      EXISTS (SELECT 1 from table2 t2 where t2.altref = SUBSTR(t1.f2, 1, 4));

如果t2.ref可能是NULL,则相应的版本为:

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1 AND
      EXISTS (SELECT 1 
              FROM table2 t2 
              WHERE t2.altref = SUBSTR(t1.f2, 1, 4) AND t2.ref IS NOT NULL
             );

答案 3 :(得分:1)

使用EXISTS

SELECT f1, f2, f3
FROM table1 t1
WHERE status = 1
AND exists (
           SELECT ref from table2 where altref = SUBSTR(t1.f2, 1,4)
           )