使用在查询外部选择的字段作为子查询的参数
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 运算符检查 null
。 Null
不是一个值 - 它是缺少值 - 因此,与它进行任何值比较(例如,=
、!=
、>
等)都会 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
如何使用在查询外部选择的字段作为子查询的参数?我认为这或多或少是这样,但显然不应该 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 运算符检查 null
。 Null
不是一个值 - 它是缺少值 - 因此,与它进行任何值比较(例如,=
、!=
、>
等)都会 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