【问题标题】:SQL compare two tables with common idSQL比较两个具有共同id的表
【发布时间】:2011-10-02 22:32:09
【问题描述】:

鉴于以下存储在 SQL 数据库中的表

桌人

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

桌房预订

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 我希望输出是:

输出表

id   username   phone 
4    Marta      555-444-777

我知道 INNER JOIN 可以完成这项工作,但我从表 room_booking 中获得了包含在 SELECT * 中的字段。

【问题讨论】:

    标签: sql compare


    【解决方案1】:

    正如其他人所说,答案是不包括不需要的列。由于您想要一个表中的所有列,而不需要另一个表中的任何列,因此解决方案是使用 person.*

    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) 
    

    【讨论】:

    • 感谢您详尽的回答!我终于改变了结构,并在查询中使用了 sub select。感谢我不知道的明显提示。
    【解决方案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.*,但您不应该在产品代码中这样做。

    【讨论】:

    • +1 用于选择星号评论。没有什么比源表结构更改的选择星更快地破坏代码了。 :)
    • 好的,谢谢你们两位关于 p.* 的输入。我会记住,在数据库不断增长的同时。谢谢!
    【解决方案3】:

    如果您在查询中使用星号,您只会获得包含的所有字段。尝试仅选择您想要获取的字段:

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

    【讨论】:

    • 感谢您的帮助!良好的输入与到底在哪里。我使用了 person.* 并按照 jmoreno 的建议更改了结构。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      两者都返回相同的结果

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        相关资源
        最近更新 更多