【问题标题】:List of persons with fields from different tables具有来自不同表的字段的人员列表
【发布时间】:2019-11-26 03:51:54
【问题描述】:

我是关系数据库的新手。默认情况下,我的客户要求提供具有不同字段的客户列表。但是在架构中就像 8 个不同的表,我需要为每个表创建一个包含字段的列表。

我正在考虑实现这样的查询。

SELECT name, surname, country_of_birth, nationality, email 
from clients,
     client_documents as documents,
     client_addresses as address

有重复的字段,但我不知道如何使用相同的uuid_client,因为它是每个表中的外键。

【问题讨论】:

  • 你使用的是 MySQL 还是 Postgresql?'
  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!
  • 顺便说一句,表格有,而不是字段。
  • 当前查询到底缺少什么?
  • 当涉及多个表时,对所有列进行限定是一种很好的编程习惯,例如clients.name 而不仅仅是 name

标签: mysql sql postgresql


【解决方案1】:

您可以使用join 和更短的表格aliases,这样您就可以更轻松地包含它的columns

select t1.name
    , t1.surname
    , t1.country_of_birth
    , t1.nationality
    , t1.email 
    , t2.documents
    , t3.city
from clients t1
inner join client_documents t2 on t1.uuid_client = t2.uuid_client
inner join client_addresses t3 on t1.uuid_client = t3.uuid_client

【讨论】:

  • 教 TS 选择有意义的表别名,例如 c 代表 clients 等。
  • 好吧,我用这个比 a、b、c 更舒服,比如说订单、订单详细信息、订单摘要,所以需要额外的字母来缩写,不像 t1、t2、t3、i知道我的第一个表是 t1,第二个连接表是 t2..etc...'
【解决方案2】:
SELECT name, surname, country_of_birth, nationality, email 
from clients, client_documents as documents, client_addresses as address

从上面的查询看来,您需要加入这些表。但是您没有提到其余表中的任何字段。因此,如果您在这些表中有任何公共字段,则可以使用 joins

或者你也可以尝试使用UNION。 请详细说明您的问题。以便我能正确回答

【讨论】:

    【解决方案3】:

    解决它的一种方法是使用JOIN。 例如:

    SELECT clients.name, clients.surname, address.country_of_birth, clients.nationality, clients.email 
    FROM clients clients 
    LEFT JOIN client_documents AS documents on clients.id = documents.client_id
    LEFT JOIN client_addresses AS address on clients.id = address.client_id
    

    我建议在这种情况下使用 LEFT JOIN,因为如果我们使用 (INNER) JOIN,您将看不到客户没有地址或文档信息。所以我们使用了 LEFT join,但正如我所说,选择取决于您的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 2020-05-25
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      相关资源
      最近更新 更多