2010-11-02 70 views
1

比方說,我有一個表和表寵物我想顯示所有有寵物的人和所有沒有寵物的人。一個人可以沒有寵物或任何數量的寵物。從其他表中匹配行的存在創建列?

我可以使用IF存在,但後來我不得不使用兩個查詢:

select * from person where exists (select * from pet where person.id = pet.owner) 

select * from person where not exists (select * from pet where person.id = pet.owner) 

有沒有辦法將這些在一個單一的查詢合併,讓我可以有一個人名數據列表和一個額外的列,說明該人是否有寵物?我不想使用group by和count,因爲我不需要寵物的數量,只有寵物的信息,所以我想將上述兩個查詢的EXISTS數據合併爲一個額外的布爾值柱。

可以做到這一點嗎?

回答

0

替代解決方案

select 
    p.*, 
    case when exists 
       (
        select * 
        from pets 
        where personId = p.id 
       ) 
       then select 1 
       else select 0 
       end 
    as HasPets 
from person p 

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

+0

這看起來不錯,雖然它在mysql命令行中給我一個語法錯誤。可能它是我的錯字,仍在檢查...... – Tom 2010-11-02 09:04:36

+0

看起來CASE只能用於存儲過程,而不能用於簡單查詢。很遺憾。因爲這正是我需要的,但我目前不使用存儲過程。 – Tom 2010-11-02 09:09:14

+0

也可能是我的一個錯字,我手頭沒有安裝mysql來試用它。 – SilverSkin 2010-11-02 09:56:44

0
SELECT person.*, COUNT(pets.id)>0 AS have_pets FROM person LEFT JOIN pet ON pet.owner=person.id; 
+0

好了,但伯爵的語句計算所有匹配的行,這正是我想避免與EXISTS其停止處理更多的匹配什麼在第一個匹配行之後的同一個所有者。 – Tom 2010-11-02 08:49:10

+0

但是,由於左連接和子句的組合,count必須大於0,它實際上會給你你需要的結果(count(pets.id)> 0會給出真或假(或1或0)) – SilverSkin 2010-11-02 09:56:11

相關問題