2012-09-11 103 views
0

有沒有辦法讓MySQL知道哪個子查詢在充滿子查詢的巨大自動生成查詢中給出了上述錯誤?如果不是的話,你會採取什麼策略來調試它?如何調試MySQL錯誤1242(子查詢返回多於1行)?

+2

分而治之:將一半以上的子查詢註釋掉並運行。看看是否有錯誤。如果沒有錯誤,請刪除評論並註釋掉另一半。如果錯誤仍然存​​在,那麼刪除一半子查詢 – bpgergo

+0

@bpgergo中的評論:這對我來說似乎非常脆弱。用一個常量值替換一個子查詢(我認爲這就是你通過註釋掉的意思)可能會導致一些連接不匹配,並且未註釋掉的一半部分被優化;或者有問題的子查詢可能與通過註釋改變的值相關。所以即使錯誤消失後,我也無法確定錯誤在哪裏。 – Tgr

+0

是的,你對WHERE子句中的子查詢是正確的。出於某種原因,我認爲子查詢在FROM子句中。 – bpgergo

回答

1

我會開始在查詢和可能的子查詢上使用LIMIT或DISTINCT。 如果這樣做不起作用,我會開始通過並單獨運行每個子查詢,是的,這是耗時的,但我發現它也有助於避免將來出現同樣的問題。

1

例子查詢:

UPDATE direct_orders do 
SET do.dealer_id = (
    SELECT d.dealer_id FROM dealers d 
    INNER JOIN dealer_addresses da 
     ON da.dealer_id = d.dealer_id 
     AND da.type = 'M' 
     AND da.status = 1 
    INNER JOIN dealer_details dd 
     ON dd.dealer_id = d.dealer_id 
     AND dd.status = 1 
    WHERE (da.address1 LIKE CONCAT( '%', do.address1, '%') AND do.postal LIKE da.postal_code) 
    OR dd.name LIKE CONCAT( '%', do.company, '%') 
    AND do.dealer_id = 0 
) 

這個查詢是失敗,出於同樣的原因作爲海報。適當測試的一種方法是做類似如下(注意LEFT JOIN這是在爲子關聯以前依賴表):

SELECT d.dealer_id FROM dealers d 
LEFT JOIN direct_orders do 
    ON do.dealer_id = 0 
INNER JOIN dealer_addresses da 
    ON da.dealer_id = d.dealer_id 
    AND da.type = 'M' 
    AND da.status = 1 
INNER JOIN dealer_details dd 
    ON dd.dealer_id = d.dealer_id 
    AND dd.status = 1 
WHERE (da.address1 LIKE CONCAT( '%', do.address1, '%') AND do.postal LIKE da.postal_code) 
OR dd.name LIKE CONCAT( '%', do.company, '%')   

這樣做透露,有實際上一個記錄從從「經銷商」表中返回多個「dealer_id」的「direct_orders」表。

相關問題