当前位置: 首页 > 面试题库 >

SQL联接三个表,联接优先

郎项禹
2023-03-14
问题内容

我有三个表:R,S和P。

表R通过外键与S连接;有 应该 是S中至少一个的记录,所以我可以加入:

SELECT
        *
    FROM 
        R
    JOIN    S ON (S.id = R.fks)

如果S中没有记录,那么我没有行,那很好。

然后表S与P联接,其中记录为P可能存在,也可能不存在,并与S联接。

所以我做

SELECT
        *
    FROM 
        R
    JOIN    S ON (S.id = R.fks)
    LEFT JOIN P ON (P.id = S.fkp)

如果我想将第二个JOIN绑定到S而不是R,例如我可以使用括号,该怎么办:

SELECT
        *
    FROM 
        R
    JOIN    (S ON (S.id = R.fks) JOIN P ON (P.id = S.fkp))

还是这已经是R,S和P之间笛卡尔积的自然行为?


问题答案:

各种外部联接和普通联接都在相同的优先级类中,并且运算符在给定的查询嵌套级别从左到右生效。您可以将连接表达式放在括号的右侧,以使其首先生效。请记住,您必须四处移动这些ON子句,以使它们与连接保持在一起-“括号中的join将其ON子句与之一起放入括号中,因此,现在它在文字上先于另一个ON子句,该子句将在括号之后。

(PostgreSQL示例)

SELECT * FROM a LEFT JOIN b ON (a.id = b.id) JOIN c ON (b.ref = c.id);

ab连接首先生效,但是我们可以通过将bc连接放在括号中来强制bc连接首先生效,如下所示:

SELECT * FROM a LEFT JOIN (b JOIN c ON (b.ref = c.id)) ON (a.id = b.id);

通常,您可以通过移动连接并更改外部连接的方向来表达相同的内容而没有多余的括号,例如

SELECT * FROM b JOIN c ON (b.ref = c.id) RIGHT JOIN a ON (a.id = b.id);



 类似资料:
  • 问题内容: 我正在尝试在BigQuery中加入三个表;表1具有一个事件的记录(即每一行是一个记录),表2具有第二个事件的记录,表3具有类别名称。 我想生成一个最终表,该表具有按类别和设备平台划分的表1和表2的计数。但是,每次运行此命令时,我都会收到一条错误消息,指出 join.t3.category不是join中任何一个表的字段 。 这是我当前的代码: 作为参考,这是表1和2之间的一个更简单的联接

  • 问题内容: 谁能告诉我如何编写查询并如上所述获取结果,谢谢!我试过加入,左右加入。一切都没有结果。 问题答案: 您可以在这两个表之间写左外部联接最好的理解方法是检查下图 查询您的要求 阅读有关 代码项目的 原始文章将对您有很大帮助:SQL Joins的可视表示 。 在以下位置找到原始版本:MySQL中的JOIN和OUTER JOIN之间的区别 。

  • 问题内容: 我正在使用此查询: 产生以下结果: 我改变了场CAT_ID到一个名为新表包含的字段,,。我如何通过也加入该表来编写新查询,以获得与上述相同的结果? 我是数据库新手,需要帮助。提前致谢 问题答案: 试试这个: 这个想法很简单,在新表中的第一个字段是工作作为 代理键 ,它没有任何与其他两个表之间的关系。然后,我们来到了另外两个领域是哪些,这些你应该映射到关系的其他两个方面。 您不能使用新模

  • 我是(My)SQL的新手,需要一些帮助:在数据库中,我有3个表,一个例子: 购买: 制造者: 型号: 在表purchases中,model是一个外键,它链接到model.id。在模型中,“制造商”是一个外键,它与“制造商id”相链接。 我的目标是一个如下图所示的表格: 我知道如何在表购买中加入以获取型号的名称。不幸的是,我不知道如何获取制造商? 我的SQL-查询:

  • 问题内容: 我试图在一个视图中联接3个表;情况如下: 我有一张桌子,其中包含正在申请住在此大学校园的学生的信息。我还有另一个表格,列出了每个学生的“大厅偏好设置”(其中有3个)。但是这些首选项只是一个ID号,并且ID号在第三张表中有一个对应的Hall Name(不是设计此数据库…)。 差不多,我在桌子上看到了他们的偏好和他们的信息,结果是… 哪里会是。所以现在我想将其与第三个表匹配,该表包含一个和

  • 问题内容: 我有三个表:“产品”,“购买”,“发票” 产品表 : Producct_no听名字 1引用 2听B 3引用C 采购表 : purchase_no听产品_no数量 001引用1听81 002引用150 003引用3引用10 发票表 : Invoice_no听产品_no数量 001引用1引用20 002引用10 003引用3引用10 我想获取每种产品的购买数量和发票数量,我使用以下查询 p