2013-07-18 39 views
0

很難解釋的一種,所以我會將其映射出來。鑑於這四個表:houses,landlord_houses,companytenant,我需要找到所有在過去14天內註冊的房屋,並獲得關於它們的一些信息。加入3張表格並根據這些表格的內容檢索字段

以前我用houses表的一個非常簡單的select查詢完成了這個。但現在我需要讓房子的出租代理人在報告上顯示。問題是,出租代理可以位於以下三個位置中的任何一個:company表,houses表或tenant表中。我想出了這個查詢至今:

select distinct h.id as id, 
    h.address1 as address1, 
    h.town as town, 
    h.postcode as postcode, 
    h.valid_from as valid_from, 
    h.valid_to as valid_to, 
    (CASE WHEN c.name IS NOT NULL THEN c.name || ' (MS)' 
     WHEN h.letting_agent IS NOT NULL THEN h.letting_agent 
     WHEN t.id IS NOT NULL THEN t.letting_agent 
     ELSE 'Unknown (Not set yet)' END) AS agent 
from houses h 
left join landlord_houses lh on lh.house_id = h.id 
left join company c on c.id = lh.company_id 
left join tenant t on t.house_id = h.id 
where h.deleted IS FALSE 
and h.archived IS FALSE 
and h.sign_up_complete IS TRUE 
and h.completed > NOW() - '14 days'::INTERVAL 
order by h.id 

這類作品,但我得到的結果回有,即使它的意思是說,一個空agent場「未知(尚未設定)」 。即使我使用了distinct h.id,我也會收到重複的房屋。我認爲這是因爲在公司,房屋和租戶桌上有多個出租代理人。

查詢中需要更改哪些內容才能使其工作?

謝謝。

+0

不同只是使得每個元組(行)都是唯一的,而不是元組中的每個單獨的值。我從來沒有嘗試psql,但也許語言支持coalesce()函數?它返回第一個非null值。例如coalesce(c.name,h.letting_Agent,t.letting_agent,'Unknown(Not set yet)') –

回答

-1

該案例陳述看起來有些不可靠。您可能會返回多個值。試試這個:

COALESCE(c.name, h.letting_agent, t.letting_agent, 'Unknown (Not set yet)') as Agent 

這將檢查c.name。如果它爲空,則移動到下一個參數並執行相同操作。

查詢中的其他內容看起來很好,並且這在postgresql中也有效。

+0

剛剛嘗試過,給了我與CASE函數完全相同的輸出,並且我仍然有空的代理字段和重複的房子。 Neater,但不是那裏! –

+0

那麼一所房子可能有多個出租代理?也許嘗試將「從c限制1中選擇c.name」併入合併 – tkendrick20

+0

房屋可以有一個出租代理,但它可以用不同的方式定義。一家公司可以擁有一座房子,因此出租代理人將成爲公司名稱(存儲在公司表格中),或者當租戶註冊後,他們可以爲出租代理提供不同的價值(例如「懷特先生」, 「懷特先生」,「白色先生」)(存儲在「租戶」表中)......我基本上需要將它作爲首選項,首先從公司表中獲得,如果它不在房屋表中,並且然後從房子的一位租客那裏。如果我無法從3中得到結果,則顯示「未知」。 –