2010-04-07 15 views
0

我最近將MySQL升級到了5.1.41。升級之前,以下的SQL工作(或者至少我以爲我記得它工作......自設計這個以來已經過了幾個星期......)。現在SQL給了我一個錯誤,指出「存檔」列是不明確的。我怎樣才能以不同的方式來寫,或者我還沒有意識到另一個問題?當我升級之前,MySQL正在返回一個「列模糊不清」錯誤

我只想返回「unit_id」,「lease_count」(存儲在另一個表中,其中應包含一個與「a.unit_id」對應的unit_id)和「lease_archived_count」(存儲在另一個帶有unit_id的表中)與「a.unit_id」)對應。

SELECT a.unit_id, 
    (SELECT count(*) FROM o_leases WHERE unit_id = a.unit_id AND archived = 0) as lease_count, 
    (SELECT count(*) FROM o_leases WHERE unit_id = a.unit_id AND archived = 1) as lease_archive_count 

FROM p_unit a, properties b, portfolio c 

WHERE a.property_id = b.properties_id 
AND b.portfolio_id = c.portfolio_id 
AND a.archived = 0 

感謝您的幫助。

+0

是否在多個表格(p_unit,properties,portfolio)中存檔了一列? – Tommy 2010-04-07 22:22:38

回答

1

只能有一個地方,這個錯誤指的是我建議給在子表中還可以選擇別名:

(SELECT count(*) FROM o_leases o WHERE o.unit_id = a.unit_id AND o.archived = 0) as lease_count, 
(SELECT count(*) FROM o_leases o WHERE o.unit_id = a.unit_id AND o.archived = 1) as lease_archive_count 

它似乎與p_unitarchived字段相沖突。

+0

謝謝felix!我發現問題的根源最終成爲表格中的錯誤列(上週我發生了硬盤崩潰,並且我裝載了錯誤的表格)。但是你的語法是我應該首先使用的。 – Ronedog 2010-04-07 23:20:24

0

我想這個錯誤是因爲o_leases不是唯一有一個存檔字段的表。 p_unit或者屬性或投資組合也必須具有該列。

但是,您還應該修復其他一些問題。首先,在大多數數據庫中,相關的子查詢是不好的執行者,應該重寫爲連接(儘管在這種情況下,您可能只需要一個case語句和一個連接)。你一般不應該考慮寫相關的子查詢。

其次,你應該永遠不要使用隱式聯接。非常糟糕的想法導致可維護性差和意外的交叉連接以及對連接的普遍理解不足。壞壞壞。這種代碼在18年前被取代,即使在五年前,你仍然會使用C#或Java代碼,並且採用更好的方法嗎?

+0

謝謝Hlgem。說實話,我很多年前就被教過這種方式加入表格,從那以後它就一直適用於我。在性能方面,我沒有看到兩者之間有太大的區別,我還沒有發現很多文章說一個比另一個更好。然而,你對於偶然交叉連接的觀點我同意。我的思想自然更好地理解隱含語法,可能是因爲我的早期編碼日。不過,如果有任何新手在這裏閱讀這個...我同意在創建交叉連接的事件中學習更新的顯式語法,但不知道它會通知您。 – Ronedog 2010-04-07 23:19:09

相關問題