我有一个select语句,它选择了具有内部联接的表中最旧的数据集
SELECT DateAndTime
,Val
,NumIndex
,TagName
,floattable.TagIndex
FROM taglogging.floattable
INNER JOIN tagtable ON tagtable.TagIndex = floattable.TagIndex
WHERE DateAndTime = oldest;
这样做效果很好,可以返回数据集。
我现在想从数据集中删除任何值列在另一个数据库中定义的最小值、最大值范围之外的记录。
我做了这个
DELETE
FROM taglogging.floattable
WHERE Val IN (
SELECT DateAndTime
,Val
,NumIndex
,TagName
,floattable.TagIndex
FROM taglogging.floattable
INNER JOIN tagtable ON tagtable.TagIndex = floattable.TagIndex
WHERE DateAndTime = oldest
) < taglogging_archive.tagmembers.tagMember_minValue
OR Val > taglogging_archive.tagMember_minValue;
在这样做的过程中,得到了一个语法错误:
Error Code: 1241. Operand should contain 1 column(s)
有人看到我语法中的错误吗:(我是MySQL语法的新手,但从MSSQL迁移后,我对我的查询逻辑充满信心
诚挚的问候,
Jordan
在第二个查询中,select语句应该只有一个与Val
列相关的列名。
您的查询应该是这样的:
DELETE from taglogging.floattable WHERE Val IN
(SELECT Val
FROM taglogging.floattable
INNER JOIN tagtable ON tagtable.TagIndex = floattable.TagIndex
WHERE DateAndTime = oldest) < taglogging_archive.tagmembers.tagMember_minValue
OR Val > taglogging_archive.tagMember_minValue;
正如错误所说。
Operand should contain 1 column(s)
告诉我们一切。顺便说一句,这不是语法错误,而是语义错误,所以你的语法必须正确。
MySQL抱怨SELECT DateAndTime, Val, NumIndex, TagName, floattable.TagIndex
正在获取多个列。IN
运算符要求在SELECT
语句中只返回一列,您返回的是5。
当你使用DELETE from taglogging.floattable WHERE Val IN
时,我猜你会想使用SELECT Val FROM
。。。
不能使用Val IN (SELECT DateAndTime, Val, NumIndex,....
必须使用Val IN(SELECT DateAndTime FROM ....
。如果使用的in左边只有一个值,那么子查询应该只返回1列(并不意味着1行)。
考虑一下错误告诉你的是什么:
操作数应包含1列
查询中是否有包含多个列的内容?是的:
... WHERE Val IN
(SELECT DateAndTime, Val, NumIndex, TagName, floattable.TagIndex ...
您希望查询引擎如何理解这一点?它应该在哪一列中查找Val
?
只使用您需要的列:
... WHERE Val IN
(SELECT Val ...
错误其自身解决方案。。您的选择查询是返回多个列,请在下方尝试
DELETE from taglogging.floattable WHERE Val IN
(SELECT Val
FROM taglogging.floattable
INNER JOIN tagtable
ON tagtable.TagIndex = floattable.TagIndex
WHERE DateAndTime = oldest) < taglogging_archive.tagmembers.tagMember_minValue
OR Val > taglogging_archive.tagMember_minValue;