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

using field selected in outer part of query as parameter for sub query

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

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

更新 感谢您到目前为止的所有回答。不过,我应该说,使用 EXIST 将始终 return 为真,因为子查询中的行将存在,只是不一定具有 'altref' 中的值,所以我修改了 EXISTS 以包含 is在 alt ref.

上不为空

你的问题是!= 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
             );

使用 EXISTS

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

这里的问题是您正在使用 [in]eqaulity 运算符检查 nullNull 不是一个值 - 它是缺少值 - 因此,与它进行任何值比较(例如,=!=> 等)都会 return "unknown"(这不是真的,所以任何 returning 评估它的行都不会 returned)。

相反,您应该使用 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^

值得注意的是,顺便说一句,exists 运算符可能更优雅一些:

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

试试这个:

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