【问题标题】:How to create query to avoid 'subquery returns more than 1 row'如何创建查询以避免“子查询返回超过 1 行”
【发布时间】:2015-12-12 10:19:11
【问题描述】:

这是我的数据库架构

我需要查看 tab3 中的值,并按顺序查看 tab2 中的 sortId 和 id。所以我创建了查询:

SELECT * FROM test.tab3 where idTab2 = 1 and sortId = 1;

没关系。

现在我有一个任务:来自 tab1 的 id 并显示来自 tab3 的值。因为 tab1 和 tab 2 是一对多的关系,所以我会这样做:

SELECT * FROM test.tab3 where idTab2 = (select id from test.tab2 where idTab1 = 1);

但我预计会出现错误:

现在是我的问题。如何创建查询或做其他事情来创建类似这样的伪代码:

ids = select id from test.tab2 where idTab1 = 1 select * from tab.test3 where idTab2 = ids[0] and ids 1

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    将其用作:

    SELECT * FROM test.tab3 where idTab2 IN (select id from test.tab2 where idTab1 = 1);
    

    了解 MySQL IN 子句see it

    【讨论】:

    • 我认为这对我来说是最好的解决方案。我考虑了一下,谢谢+1
    【解决方案2】:

    如果子选择可以返回多行,请改用EXISTS

    SELECT *
    FROM test.tab3 t3
    WHERE EXISTS (
        SELECT *
        FROM test.tab2 t2
        WHERE t2.idTab1 = 1 AND t3.idTab2 = t2.id
    ) --                    ^^^^^^^^^^^^^^^^^^^^^
    

    idTab2 = SELECT id ... 的比较已移至嵌套的SELECTWHERE 子句中。

    【讨论】:

    • 是的,好主意。谢谢+1
    【解决方案3】:

    如果我理解得很好,您想获取 tab3 中与 tab1 到 tab2 相关的所有行,不是吗?然后,您需要在三个表之间进行 join

    SELECT tab3.* FROM tab3 
        INNER JOIN tab2 ON tab3.idTab2=tab2.id 
        INNER JOIN tab1 ON tab2.idTab1=tab1.id 
    WHERE tab1.id=<your parameter>;
    

    如果您不需要访问 tab1 中除id 之外的任何列,则可以让tab1 appart 加入:

    SELECT tab3.* FROM tab3 
        INNER JOIN tab2 ON tab3.idTab2=tab2.id 
    WHERE tab2.idTab1=<your parameter>;
    

    【讨论】:

    • 是的,好主意。谢谢+1
    【解决方案4】:

    使用 MySQL 时,您可以在(子)查询的末尾使用 LIMIT 子句。这将您的结果集限制为给定的数字。但小心点。由于在您的案例中选择第一个的结果可能没有明确的顺序,因此结果可能不是确定性的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多