如何创建查询以避免'子查询返回超过1行'

时间:2015-12-12 10:19:11

标签: mysql sql

那是我的数据库架构

enter image description here

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

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

没关系。

现在我有一个任务:来自tab1的id并显示来自tab3的值。因为tab1和tab2有一对多关系,所以我做了类似的事情:

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

但我预计错误: enter image description here

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

  

ids =从test.tab2中选择id,其中idTab1 = 1 select * from   tab.test3其中idTab2 = ids [0]和ids 1

4 个答案:

答案 0 :(得分:2)

将其用作:

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 ...的比较已移至嵌套WHERE的{​​{1}}子句中。

答案 2 :(得分:2)

如果我理解得很好,你想得到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>;

如果您不需要访问id以外的tab1中的任何列,您可以让tab1设置加入:

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

答案 3 :(得分:1)

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