SELECT t.* from test t where t.name ='test123' and t.subject NOT IN (SELECT * from result_master where email = 'fusion1234@gmail.com')
上述查询给出以下错误:
1241 - 操作数应包含1列错误显示
知道它有什么问题吗?
答案 0 :(得分:3)
错误说明了一切。
使用IN
时,您应该只选择子查询中的必需列(不要使用*
):
SELECT t.*
from test t
where t.name ='test123'
and t.subject NOT IN (SELECT subject
from result_master
where email = 'fusion1234@gmail.com')
答案 1 :(得分:0)
内部查询应该是
(SELECT subject
from result_master
where email = 'YourEmail@domain.com')
为什么?
因为,在您的问题中,您要将电子邮件列值与多个列值进行比较。
在您返回的子查询中表示10个字段,但您只能使用一列。它实际上是内部以逗号分隔的列表,但是您为外部查询提供了错误的结果。
答案 2 :(得分:0)
虽然简单的解决方案是使用NOT IN
,但十NOT EXISTS
更适合此类查询。您可以将*
与NOT EXISTS
一起使用,但我更喜欢使用1
:
SELECT t.*
from test t
where t.name ='test123' and
NOT EXISTS (SELECT 1
from result_master rm
where rm.email = 'fusion1234@gmail.com' and
t.subject = rm.subject
);
为什么这样更好?两个版本之间存在语义差异。如果子查询中result_master.subject
的任何值为NULL
,则NOT IN
将永远不会返回任何行。在这种情况下,NOT EXISTS
执行通常需要的操作 - 它会忽略NULL
值。
注意:即使列(说subject
)声明为NOT NULL
,我仍然偏向NOT EXISTS
。它通常还具有比NOT IN
更好的性能特征。