# It works!
select * from device where device.user_id in (select user_id from user);
# It doesn't work!
select user_id into test from user;
select * from device where device.user_id in test;
Run Code Online (Sandbox Code Playgroud)
为什么第一个有效,而第二个有效?
如果我想where在上面的子句中使用变量,我该怎么做?
实际上select user_id from user会导致错误,因为user是返回当前用户的保留关键字(函数) - 并且没有名为user_id. 请参阅此处:https : //rextester.com/EPWT79333
它在第一个查询的子选择中起作用的原因是子查询表中不可用的任何列都将解析为来自外部查询的列。
所以查询:
select *
from device
where device.user_id in (select user_id from user);
Run Code Online (Sandbox Code Playgroud)
实际上是一样的:
select *
from device
where device.user_id = user_id;
Run Code Online (Sandbox Code Playgroud)
如果您确实有一个名为的表user,则必须引用它,以明确表示您指的是表,而不是内置函数:"user"
所以第一个查询的正确形式是:
select *
from device
where device.user_id in (select user_id from "user");
Run Code Online (Sandbox Code Playgroud)