SELECT id,
(SELECT payer_id FROM transactions WHERE id = user_id),
(SELECT sentence FROM cofg_sentences WHERE id = user_id),
(SELECT name FROM cofg_options WHERE id = user_id),
(SELECT hour FROM cofg_time WHERE id = user_id),
(SELECT field_id, url FROM cofg_feeds WHERE id = user_id),
(SELECT field_id, fb_user FROM cofg_accounts WHERE id = user_id)
FROM users WHERE token = '.......'
我正在尝试执行此查询,但收到此错误:
#1241 - Operand should contain 1 column(s)
如果我删除第二列子查询,我得到:
#1242 - Subquery returns more than 1 row
我知道还有其他问题有相同的错误,但查询不同。我不想使用JOIN,因为我读过它会降低性能。
这里有什么问题?任何形式的帮助表示赞赏:)
提前致谢
答案 0 :(得分:0)
我不想使用JOIN,因为我读过它会降低性能。
你测量它时发现了什么?
将子查询放在select子句中的模式是解决某些性能问题的可行技术如果您知道优化器正在做什么以及您的数据是什么样的。
您应该首先使用正确的连接实现代码,然后在需要更改时更改它。
#1241 - Operand should contain 1 column(s)
由
引起(SELECT field_id, url FROM
如果使用子查询是合适的,可以通过将值与分隔符连接,然后再将它们拆分来避免此错误。
#1242 - Subquery returns more than 1 row
应该是不言自明的,通过聚合行或限制为一行来解决。
答案 1 :(得分:0)
你是否同意典型的SQL行是这样的:
SQL Row Example:
COLUMN1 COLUMN2 COLUMN3 COLUMN4
1 anyvalue 2 othervalue
当你运行一个子查询时,它应该返回一个带有1行和1列的简单VALUE,这样你仍然有一个典型的SQL行。
SQL Row Example:
COLUMN1 COLUMN2 COLUMN3 COLUMN4
SUBQUERY anyvalue 2 othervalue
让我们走吧。拳头错误:
1241 - 操作数应包含1列
你试图将2列放在一个应该有一个简单值的地方。
第二个错误:
1242 - 子查询返回超过1行
你的SQL返回了很多具有很多值的行,但它只能像我之前所说的那样只有一个简单的值。
添加TOP以限制行号将是您的解决方案:
SELECT id,
(SELECT TOP 1 payer_id FROM transactions WHERE id = user_id),
(SELECT TOP 1 sentence FROM cofg_sentences WHERE id = user_id),
(SELECT TOP 1 name FROM cofg_options WHERE id = user_id),
(SELECT TOP 1 hour FROM cofg_time WHERE id = user_id),
(SELECT TOP 1 url FROM cofg_feeds WHERE id = user_id),
(SELECT TOP 1 fb_user FROM cofg_accounts WHERE id = user_id)
FROM users WHERE token = '.......'
我不想干涉你的逻辑。我将解释有关子查询的一些内容:
您的SELECT中有6个子查询。这意味着您将为每个用户打六次数据库。 如果您有100个用户,则只需在一条简单的SQL指令中就可以将数据库命中600次。
考虑使用连接!