[英]How to create query to avoid 'subquery returns more than 1 row'
那是我的數據庫模式
我需要查看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 =從test.tab2中選擇id,其中idTab1 = 1從tab.test3中選擇*,其中idTab2 = ids [0]和ids 1
用作:
SELECT * FROM test.tab3 where idTab2 IN (select id from test.tab2 where idTab1 = 1);
要了解MySQL IN子句, 請參見
如果子選擇可以返回多行,請改用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 ...
的比較已移入嵌套SELECT
的WHERE
子句中。
如果我了解得很好,您想通過tab2獲取tab3中與tab1相關的所有行,不是嗎? 然后,你需要三個表之間的連接 :
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
用作連接的一部分:
SELECT tab3.* FROM tab3
INNER JOIN tab2 ON tab3.idTab2=tab2.id
WHERE tab2.idTab1=<your parameter>;
使用MySQL時,您可以在(子)查詢的末尾使用LIMIT子句。 這將結果集限制為給定的數量。 不過要小心。 因為從您的情況中選擇第一個結果可能沒有明確的結果順序,所以結果並不確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.