【问题标题】:Joining 2 tables based on a relation defined in a third table and putting several rows from the second table in a single row根据第三个表中定义的关系连接 2 个表,并将第二个表中的几行放在一行中
【发布时间】:2014-08-19 03:45:20
【问题描述】:

我正在学习 SQL,目前我正在尝试使用 SQLite 编写应用程序。目前我有 3 张桌子:

合作: cid 整数主键, ...

人: pid 整数主键, 名称字符串, ...

person_works_in_cooperative: cid 整数, pid 整数, 工作整数

我想生成一个新表,其中每一行都有来自合作社的数据,还有来自工作为“0”(总裁)、“1”(秘书)、“2”(司库)和工作为“4”的三个人(顾问)。

目前我能够加入表格,但我找不到在决赛桌中合并 6 个不同行的人的方法。有人可以给我建议如何进行吗?

编辑:到目前为止我写的是一个很长的 JOIN:

SELECT cooperative.cid, person.name AS president,  person.pid  AS president_pid,
person.name AS secretary,  person.pid  AS secretary_pid, person.name AS treasurer,
person.pid  AS treasurer_pid,  person.name AS counselor1, person.pid  AS 
counselor1_pid, person.name AS counselor2, person.pid  AS counselor2_pid, person.name
AS counselor3, person.pid  AS counselor3_pid FROM cooperativ1 LEFT JOIN 
person_works_in_cooperative ON cooperative.cid = person_works_in_cooperative.cid 
LEFT JOIN person ON person_works_in_cooperative.pid = person.pid;

但我不知道如何告诉数据库我希望我询问的每一对人名和 pid 应该对应于 person 表中的不同人。

【问题讨论】:

  • 显示你目前写的SQL。

标签: sql sqlite


【解决方案1】:

这将为您提供三个表中的所有列:

SELECT *
FROM cooperative c
    JOIN person_works_in_cooperative pw ON pw.cid = c.id
    JOIN  PERSON p ON pw.pid = p.id
WHERE pw.job IN (0, 1, 2, 4);

并将向您展示每个合作社的所有总裁秘书等。

如果您只需要来自特定合作社的信息,您可以在WHERE 子句中添加一个附加条件:

AND c.id = 1;

编辑

相反,如果您希望将所有相关信息与 cooperative 之一放在同一 上,那么使用普通 SQL 是无法做到的。

【讨论】:

  • 谢谢,但是对于在数据库中拥有有效工作的每个人,此查询为我提供了不同的行。但我需要的是,在同一个合作社工作的每个人都出现在与该合作社相对应的同一行中。
  • 比如,如果合作社 1 中有 3 个人,您希望合作社的行有 3 列吗?如果有 5 个人在合作社 2 中工作,您希望合作社的行有 5 列吗?如果是这种情况,我认为这不能用普通的 SQL 来完成,你应该动态地生成查询。如果您有像 Oracle 这样的 RDBMS,您可以动态组合查询,否则您必须依赖服务器端编程语言。
  • 是的,看起来这不可能只用一个查询来完成我的计划。正如您所指出的,这意味着一种获取具有可变列数的表的方法,这不太适合关系模型。感谢您的回答。由于正确答案是“无法完成”,我会将您的答案标记为已接受。
  • @ThiagoHarry 好。我编辑了问题以添加附加信息:-)
【解决方案2】:
select c.cid, 
       (select pid from person_works_in_cooperative pc0 where pc0.cid = c.cid and pc0.job = 0 ) "president",
       (select pid from person_works_in_cooperative pc1 where pc1.cid = c.cid and pc1.job = 1) "secretary",
       (select pid from person_works_in_cooperative pc2 where pc2.cid = c.cid and pc2.job = 2) "treasurer"
from cooperative c 

这只是每个合作社的总裁、秘书和财务主管的解决方案。无法为 3 位辅导员发明一个简单的解决方案。对不起。

【讨论】:

  • 感谢您的回答。抱歉,我认为我在第一篇文章中过度简化了问题。我不仅需要获取人的 pid,还需要获取人的姓名,所以我真的需要加入 3 个表。您的解决方案确实适用于加入后的总裁、秘书和财务主管,但我担心必须使用子查询来获取每个合作社中每个人的每个属性。也许最好的办法是再写一个查询,让 PHP 中的所有人为每个合作社使用 PHP,并在打印结果之前在服务器端编程中组合查询。
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多