如何使用在查询外部选择的字段作为子查询的参数?我认为这或多或少是它,但显然不是应该返回几行
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
答案 0 :(得分:3)
这里的问题是您使用[in] eqaulity运算符检查null
。 Null
不是一个值 - 它缺乏价值 - 因此,与它的任何价值比较(例如,=
,!=
,>
等都会返回“未知“(这不是真的,因此不会返回任何返回评估它的行。)
相反,您应该使用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)
)