【问题标题】:Issues with SQL ERROR: subquery returned more than 1 rowSQL ERROR 问题:子查询返回多于 1 行
【发布时间】:2017-09-29 16:21:48
【问题描述】:

我正在尝试设计一个 SQL 语句,在该语句中我遇到了该主题中的错误。我了解有关此错误的其他主题,但没有看到任何关于我试图根据多行获取值的具体问题。我将不胜感激。这是我的简化表和 SQL 语句。

表A

member_id
----------
1
2
3
4

表B

user_id  field_id  value
------------------------
1        1         red
2        2         red
1        2         blue
4        1         red
2        1         blue 
3        1         blue

查询:

SELECT DISTINCT(member_id) 
FROM TableA 
WHERE member_id = (SELECT b.user_id 
                   FROM TableB b 
                   INNER JOIN TableB a on a.user_id = b.user_id 
                   WHERE a.field_id = '1' ANd a.value = 'red' 
                     AND b.field_id = '2' ANd b.value = 'blue')

我正在尝试从表 A 中选择 member_id 作为表 B 中的 user_id,其中表 B 中用户的 field_id(1) = 红色和同一用户的 field_id(2) = 蓝色。

因此,select 语句应该返回 id = 1 的 member_id。

【问题讨论】:

  • 您是否收到错误消息?我认为您可以通过简单地将 distinct 放入您的子查询并完全删除外部查询来获得您想要的

标签: sql select row


【解决方案1】:

使用您对子选择的查询,只需 JOIN tableA。

SELECT a.*
FROM TableB b1 
INNER JOIN TableB b2 on b1.user_id = b2.user_id 
INNER JOIN tableA a ON a.member_id  = b1.user_id
WHERE b2.field_id = '1' ANd b2.value = 'red' 
  AND b1.field_id = '2' ANd b1.value = 'blue'

【讨论】:

    【解决方案2】:

    user_id 分组,您可以尝试计算点击次数并进行相应过滤:

    SELECT user_id
      FROM tableB
      GROUP BY user_id
      HAVING SUM(CASE WHEN field_id = 1 AND value = 'red'  THEN 1 ELSE 0 END) > 0
         AND SUM(CASE WHEN field_id = 2 AND value = 'blue' THEN 1 ELSE 0 END) > 0
    

    另外一个变种怎么样:

    SELECT *
      FROM tableA AS a
      WHERE EXISTS (SELECT 1 FROM tableB b where b.user_id = a.member_id AND B.field_id = 1 AND B.value = 'red')
        AND EXISTS (SELECT 1 FROM tableB b where b.user_id = a.member_id AND B.field_id = 2 AND B.value = 'blue')
    

    【讨论】:

      【解决方案3】:

      您的内部查询正在执行 TableB 到自身的内部连接。这几乎没有必要。

      如果您想要来自 tableA 的记录,其中 user_id = member_idfield_ID = 1 时为 value = red,或 field_id = 2 时为 value = blue,您将需要更多类似的内容:

      SELECT distinct(member_id) 
      FROM TableA inner join TableB on user_id = member_id 
      WHERE (field_id = '1' AND value = 'red')
         OR (field_id = '2' AND value = 'blue')
      

      如果您只想要两者都有的记录,只需在原始内部查询中抛出一个 distinct。

      【讨论】:

      • 我认为你的逻辑有缺陷,这个人确实需要这两个连接。如果他使用 AND,条件 (field_id='1' and somethingelse) and (field_id='2' and somethingother) 将永远不会为真。
      • 好点。你对他原帖的评论也是正确的。
      猜你喜欢
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2020-07-04
      相关资源
      最近更新 更多