如何编写通过关系表获取结果的 SQL 语句? (多对多)

Posted

技术标签:

【中文标题】如何编写通过关系表获取结果的 SQL 语句? (多对多)【英文标题】:How to write a SQL statement which gets results via a relationship table? (many to many) 【发布时间】:2008-10-16 14:51:00 【问题描述】:

我有 3 个表(存档有很多部分,部分(可能)属于很多存档):

archive

id PK description

archive_to_section

archive_id PK FK section_id PK FK

section

id PK description

列出属于某个归档 id 的所有部分的 SQL 会是什么样子?

我只是在学习 SQL。从我读到的内容听起来我需要加入或工会?仅供参考,我正在使用 postgres。


[编辑]这是来自 gdean2323 的答案,没有别名:

SELECT section.* 
FROM section 
INNER JOIN archive_to_section 
ON section.id = archive_to_section.section_id 
WHERE archive_to_section.archive_id = $this_archive_id

【问题讨论】:

【参考方案1】:
SELECT s.* 
FROM section s INNER JOIN archive_to_section ats ON s.id = ats.section_id 
WHERE ats.archive_id = 1

【讨论】:

有必要写缩写吗?对于初学者来说可能更容易理解。谢谢 不需要使用缩写(别名),很多人都使用它们。我不喜欢。查看别名***.com/questions/198196/when-to-use-sql-table-alias的优缺点讨论【参考方案2】:
SELECT s.*
FROM archive_to_section ats
  INNER JOIN section s ON s.id=ats.section_id
WHERE ats.archive_id= @archiveID

【讨论】:

没错。要意识到的重要一点是存档表并没有考虑到这一点。 我想你的意思是 INNER JOIN section s ON s.id=ats.section_id * 和 @ 符号是什么意思? * 表示该表的所有字段,@archiveID 是一个参数,如果您愿意,可以将其替换为您选择的archive_id。

以上是关于如何编写通过关系表获取结果的 SQL 语句? (多对多)的主要内容,如果未能解决你的问题,请参考以下文章

sql中一对多关系的查询结果的多行转换成一行多列

sql 一对多的查询

sql 一对多查询

多条SQL语句对查询结果集的垂直合并

连接两表查询结果的SQL语句

Mybatis 的嵌套查询与嵌套结果的区别