簡體   English   中英

如何創建查詢以避免“子查詢返回多於1行”

[英]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 ...的比較已移入嵌套SELECTWHERE子句中。

如果我了解得很好,您想通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM