2011-10-02 89 views
2

由於存儲在SQL數據庫中的以下表SQL比較兩個表與普通ID

表人

id username phone 
1 james  555-666-777 
2 gabriel 666-555-777 
3 Lucas  222-888-999 
4 Marta  555-444-777 

表room_booking

id person_id room  time 
1 2   A2  13:00 
2 4   B5  09:00 
3 1   C1  20:00 

通過僅獲得room_booking id number 2 我想輸出爲:

輸出t能夠

id username phone 
4 Marta  555-444-777 

我知道INNER JOIN可以做的工作,但我從包含SELECT *room_booking領域。

回答

4

正如其他人所說,答案是不包括不需要的列。既然你想都來自同一個表中,並沒有與其他表中的列列的,該解決方案是使用的人。*

Select distinct p.* 
from person p 
    Inner join room_booking r 
     On r.person_id = p.id 

我包括不同,因爲以你的結構,你很可能會最終每人有超過一次預訂。

替代語法實現同樣的目標...

/*using sub select*/ 
Select * from person where id in (select person_id from room_booking); 

/*using cte, distinct and inner join*/ 
; pids as(select distinct person_id from room_booking) 
Select person.* 
from pids 
    Inner join person on person_id = id; 

/*using cte and subquery with explicit column list */ 
; pids as(select person_id from room_booking) 
Select id, username, phone 
from person 
Where id in (select person_id from pids) 
+0

感謝您的詳細解答!我終於改變了結構,並在查詢中使用了子選擇。感謝我不知道的獨特暗示。 –

1

如果您在查詢中使用星號,則只會包含所有字段。儘量選擇只想要得到的字段:

SELECT person.id, username, phone 
FROM person JOIN room_booking ON person.id = room_booking.person_id 
WHERE room_booking.id = 2 
+0

感謝您的幫助!良好的輸入與最終的地方。我用過人。*,並根據jmoreno的建議改變了結構。 –

1

我知道INNER JOIN可以做的工作,但我從表中包含 room_booking領域。

不要選擇他們,你不會得到他們:

select p.id ,p.username ,p.phone from Person p 
inner join room_booking rb 
on rb.person_id=p.id 
+0

感謝您的幫助! –

2
select 
    p.id, 
    p.username, 
    p.phone 
from Person p 
inner join room_booking rb 
on p.id = rb.person_id 
where rb.id = 2 

或者,您也可以選擇p.*但你不應該這樣做,在督促代碼。

+0

對於選擇明星評論+1。沒有任何東西比源表結構更改的選擇星更快地分解代碼。 :) – 2011-10-03 00:18:33

+0

好的,謝謝你們關於p的輸入。*我會記住,數據庫不斷增長。謝謝! –

1

都返回相同的結果

======================1 
SELECT C.CountryName,C.ZipCode,P.Population 
FROM tbl_Country C, tbl_Population P 
WHERE C.ID= P.ID 
======================2 
SELECT C.CountryName,C.ZipCode,P.Population 
FROM tbl_Country C inner join tbl_Population P 
on C.ID= P.ID