gpt4 book ai didi

sql - 如何在不重复行的情况下合并 2 个 SQL 表中的行?

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:44 24 4
gpt4 key购买 nike

我想这个查询有点基础,我应该了解更多有关 SQL 的知识,但还没有对连接做太多工作,我想这就是这里的解决方案。

我有一张人员表和一张他们担任的工作角色表。一个人可以有多个工作,我希望得到一组结果,每个人一行包含他们的详细信息和他们的工作角色。

下面有两个示例表(people 和 job_roles),因此您可以更轻松地理解问题。

 id |  name  |    email_address   |  phone_number 1  |  paul  |  paul@example.com  |  123456 2  |   bob  |  bob@example.com   |  567891 3  |  bart  |  bart@example.com  |  987561

工作角色

 id  |  person_id  |     job_title   | department  1  |      1      |     secretary   |    hr  2  |      1      |     assistant   |   media  3  |      2      |      manager    |    IT  4  |      3      |  finance clerk  |  finance  4  |      3      |      manager    |    IT

这样我就可以像这样输出每个人和他们的角色

Name: paulEmail Address: paul@example.comPhone: 123456Job Roles: Secretary for HR departmentAssistant for media department_______Name: bobEmail address: bob@example.comPhone: 567891Job roles:Manager for IT department

那么我如何获取每个人的信息(来自 people 表)以及他们的工作详细信息(来自 job_roles 表)以像上面的示例一样输出。我想这会是一种将他们的工作和相关部门合并到一个工作列中的方法,可以拆分输出,但也许有更好的方法,sql 会是什么样子?

谢谢

保罗

PS 如果有任何不同的话,它将是一个 mySQL 数据库

最佳答案

它看起来像一个直接连接:

SELECT p.*, j.*
FROM People AS p INNER JOIN Roles AS r ON p.id = r.person_id
ORDER BY p.name;

剩下的工作是格式化;最好通过报告包完成。


Thanks for the quick response, that seems a good start but you get multiple rows per person like (you have to imagine this is a table as you don't seem to be able to format in comments):

id | Name | email_address    | phone_number | job_role  | department
1 | paul | paul@example.com | 123456 | secretary | HR
1 | paul | paul@example.com | 123456 | assistant | media
2 | bob | bob@example.com | 567891 | manager | IT

I would like one row per person ideally with all their job roles in it if that's possible?

这取决于您的 DBMS,但大多数可用的不支持 RVA - 关系值属性。您想要的是让结果的工作角色和部门部分像与用户关联的表一样:

+----+------+------------------+--------------+------------------------+
| id | Name | email_address | phone_number | dept_role |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 1 | paul | paul@example.com | 123456 | | secretary | HR | |
| | | | | | assistant | media | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 2 | bob | bob@example.com | 567891 | | manager | IT | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+

这准确地代表了您想要的信息,但通常不是一个选项。

因此,接下来会发生什么取决于您的报告生成工具。使用我最熟悉的一个(Informix ACE,Informix SQL 的一部分,可从 IBM 获得,用于 Informix DBMS),您只需确保数据已排序,然后打印姓名、电子邮件地址和电话号码在报告的 'BEFORE GROUP OF id' 部分和 'ON EVERY ROW' 部分中,您将只处理(打印)角色和部门信息。

将报告格式与数据检索操作分开通常是个好主意;这是一个必要的示例,除非您的 DBMS 具有帮助格式化所选数据的异常功能。


Oh dear that sounds very complicated and not something I could run easily on a mySQL database in a PHP page?

RVA 的东西 - 你是对的,它不适用于 MySQL 和 PHP。

另一方面,有数以百万计的报告(意思是经过格式化以呈现给用户的查询结果)大致执行此操作。它们的技术术语是“Control-Break Report”,但基本思想并不难。

您记录上次处理的“id”号 - 您可以将其初始化为 -1 或 0。当当前记录的 ID 号与之前的编号不同时,您就有了一个新用户,您需要为新用户启动一组新的输出行并打印姓名、电子邮件地址和电话号码(并更改最后一个已处理的身份证号码)。当当前记录具有相同的 ID 号时,您所做的就是处理工作角色和部门信息(而不是姓名、电子邮件地址和电话号码)。当 ID 号发生变化时会发生“中断”。单级破控,不难;如果你有 4 或 5 个级别,你必须做更多的工作,这就是为什么有报告包来处理它。

所以,这并不难 - 只需要一点点小心。

关于sql - 如何在不重复行的情况下合并 2 个 SQL 表中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3105052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com