SQL比较两个表与普通ID

问题描述:

由于存储在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领域。

正如其他人所说,答案是不包括不需要的列。既然你想都来自同一个表中,并没有与其他表中的列列的,该解决方案是使用的人。*

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

感谢您的详细解答!我终于改变了结构,并在查询中使用了子选择。感谢我不知道的独特暗示。 –

如果您在查询中使用星号,则只会包含所有字段。尽量选择只想要得到的字段:

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

感谢您的帮助!良好的输入与最终的地方。我用过人。*,并根据jmoreno的建议改变了结构。 –

我知道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

感谢您的帮助! –

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 
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