java 和 sql 显示 #1241 - 操作数应包含 1 列
Posted
技术标签:
【中文标题】java 和 sql 显示 #1241 - 操作数应包含 1 列【英文标题】:java and sql showed #1241 - Operand should contain 1 column(s) 【发布时间】:2021-01-28 11:04:07 【问题描述】:SELECT * FROM rooms WHERE roomID NOT IN (SELECT * FROM rooms r,reservation e WHERE r.roomID=e.roomID AND (checkout > ?) AND (check-in < ?));
这是我的 java 程序的 SQL 字符串,我希望它过滤在选定的入住和退房日期期间未预订的房间。但命令显示:#1241 - 操作数应包含 1 列。我想知道它有什么问题。
【问题讨论】:
SELECT *
不选择一列,它选择多列
【参考方案1】:
我希望它过滤在选定的入住和退房日期未预订的房间。但命令显示:
如果你想找空房,我建议not exists
:
SELECT r.*
FROM rooms r
WHERE NOT EXISTS (SELECT 1
FROM reservation res
WHERE res.roomID = r.roomID AND
checkin < :period_end AND
checkout > :period_start
);
当然,您可以使用?
作为参数。我使用了:period_start
和:period_end
,所以查询很清楚这些值是如何使用的。
【讨论】:
【参考方案2】:roomID 是单个值。 SELECT * 返回每一列 - 即多个值。 someExpr IN (SELECT ...)
的 SQL 概念有效,但仅在您选择单个列时。
您最可能需要的只是将SELECT * FROM rooms r, reservation e
) 替换为SELECT r.roomID FROM...
。
但是,整个查询都是可疑的。以这种方式编写它非常低效和奇怪。您已经选择了相关的房间,所以..
SELECT r.* FROM rooms r
LEFT JOIN reservation e ON r.roomID = e.roomID
AND (e.checkout > ?) AND (e.checkin < ?)
WHERE e.roomID IS NOT NULL;
这会尝试将预订连接到您的房间表,并且由于它是左外连接,如果匹配的预订为零,则每个预订表的列都会获得一个 NULL 值。所以,我们寻找那个 - 那些是没有找到匹配预订的房间。
【讨论】:
我还没有选择任何房间。我的主要目标是使用入住日期和退房日期来查找在这两个日期之间未预订的所有可用房间。是的,这很奇怪,因为我急于完成我的任务,呵呵 我的查询完全符合您的要求。 或者是我的整个代码有问题,它只是显示两个日期之间的预订房间?嗯以上是关于java 和 sql 显示 #1241 - 操作数应包含 1 列的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列
Zend Framework 基数违规:1241 操作数应包含 1 列