gpt4 book ai didi

sql - 需要有关具有内连接和外连接的 sql 查询的帮助

转载 作者:行者123 更新时间:2023-12-04 06:36:26 25 4
gpt4 key购买 nike

我真的需要帮助正确地进行此查询。我无法分享实际的表名和列名,但会尽力简单地布置问题。

假设有以下表格。表和键不能更改。时期。我不在乎你是否认为这是一个糟糕的设计,这个问题不是一个设计问题,它是关于 SQL 语法的。

  • 表 A - 名为 id1 的主键
  • Table B - 包含两个外键,TableA.id1 和 Foo.id2(忽略 Foo,这无关紧要)
  • 表 C - 包含两个外键,TableA.id1 和 Foo.id2,额外有趣
    列。

  • 约束:
  • SQL 获取一组作为参数传入的 id1。
  • 它必须返回表 C 行的列表。
  • 它必须只返回表 C 行,其中表 B 行存在匹配的 TableA.id1 和 Foo.id2 - 表 C 中存在与表 B 不匹配的行
  • 即使不存在表 C 行,也必须为每个传入的 id1 返回一行。

  • 起初,我尝试了从表 A 到表 B 的左外连接,然后是到表 C 的内连接。这违反了上面的第 4 条规则,因为内连接会删除这些行。

    接下来我尝试了两个左外连接。这更接近,但具有包含与表 A 连接匹配到表 B 的行的副作用,但没有相应的表 C 条目,这不是我想要的。

    所以,这就是我想出的。
    SELECT
    a.id1,
    c.*
    FROM
    TableB b
    INNER JOIN
    TableC c USING (id1,id2)
    RIGHT OUTER JOIN
    TableA a USING (id1)
    WHERE
    a.id1 in (x,y,z)

    我对 Right Outer Join 有点警惕,因为我读过的文档说它可以用 Left Outer 替换,但在这种情况下似乎并非如此。这似乎也有点罕见,这让其他开发人员感到紧张,所以我很谨慎。

    所以,三个问题合而为一。
  • 这样对吗?
  • 我是否正确使用了正确的外连接?
  • 有没有更干净的方法来实现同样的目标?

  • 编辑:数据库是 MySQL

    最佳答案

    您可以使用括号将其重写为 LEFT OUTER JOIN。在伪 SQL 中更改此:

    SELECT ...
    FROM b
    INNER JOIN c ON ...
    RIGHT OUTER JOIN a ON ...

    对此:
    SELECT ...
    FROM a
    LEFT OUTER JOIN (
    b INNER JOIN c ON ...
    ) ON ...

    关于sql - 需要有关具有内连接和外连接的 sql 查询的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4822247/

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