【问题标题】:Complex Nested SQL Query复杂的嵌套 SQL 查询
【发布时间】:2018-07-29 02:55:45
【问题描述】:

更新我将调试我的问题并重新发布它,并更详细地说明!对于造成的混乱,我深表歉意!

更新所有评论或发布答案的人我会将您链接到我的重新发布,感谢您抽出时间检查我的问题和评论/答案!

我会让我的问题简单明了;当我包含前三个子查询时,下面的代码块会产生语法错误。

我做错了什么?

SELECT 
      parent1.parent1_id,
      parent1.child1_id,
      parent1.child2_id,
      parent1.child3_id,
      parent2.parent2_id,
      parent2.child1_id,
      parent2.child2_id,
      parent2.child3_id
   FROM 
      parent1
         LEFT JOIN 
         ( SELECT 
                 child1.child1_id, 
                 child1.child1_content
              FROM 
                 child1 
              WHERE 
                 child1.child1_id = parent1.child1_id ) child1
         ( SELECT 
                 child1_extras.child1_extrasID, 
                 child1_extras.child1_extrasContent
              FROM 
                 child1_extras
              WHERE 
                 child1_extras.child1_id = child1.child1_id )
            ON parent1.child1_id = child1.child1_id
         LEFT JOIN child2
         ( SELECT 
                 child2.child2_id, 
                 child2.child2_content
              FROM 
                 child2 
              WHERE
                 child2.child2_id = parent1.child2_id )
         ( SELECT 
                 child2_extras.child2_extrasID, 
                 child2_extras.child2_extrasContent
              FROM 
                 child2_extras
              WHERE 
                 child2_extras.child2_id = child2.child2_id )
            ON parent1.child2_id = child2.child2_id
         LEFT JOIN child3
         ( SELECT 
                 child3.child3_id, 
                 child3.child3_content
              FROM 
                 child3
              WHERE 
                 child3.child3_id = parent1.child3_id )
         ( SELECT 
                 child3_extras.child3_extrasID, 
                 child3_extras.child3_extrasContent 
              FROM 
                 ( SELECT 
                         comments.comment_id, 
                         comments.comment
                      FROM 
                         comments 
                      WHERE 
                         comments.child3_extrasID = child3_extras.child3_extrasID ) child3_extras
           JOIN child3 
              ON child3_extras.child3_id = child3.child3_id )

              ON parent1.child3_id = child3.child3_id
           LEFT JOIN followers
              ON parent1.user_id = followers.followed_id
              AND parent1.parent1_timestamp > followers.follower_timestamp
              AND parent1.parent1_id NOT IN ( SELECT removed.isub_rmv FROM removed )
              AND parent1.parent1_hide = false
   WHERE 
      followers.follower_id = {$_SESSION['info']}
      {$portname_clause}
   ORDER BY 
      parent1.parent1_timestamp DESC
      LIMIT {$postnumbers} 
   OFFSET 
      {$offset}

非常感谢。

【问题讨论】:

  • 你做错了什么?您正在编写过于复杂的查询,而没有先测试查询的组成部分。简化和扩展是复杂 SQL 的一个很好的模型。
  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,不是特定数据库产品的名称(而且你查询的是非标准的SQL)
  • 我做错了什么? - 真的吗?你提问的方式!
  • 好吧,我不想太苛刻,因此有一些提示:指定您正在使用的 RDBMS(产品和版本),指定您遇到的错误,尝试对所有不产生的内容进行注释错误。换句话说:将其减少到不起作用的部分。并且请:不要指望外国人把闲暇时间花在这样的问题上......
  • LEFT JOIN child1 (SELECT 是一个语法错误,即使没有反引号。

标签: sql


【解决方案1】:

问题出在你的语法上。我重新格式化了您的查询,但不知道具体指的是什么。正如评论中所述,分别简化您的查询以了解它们是否有效,然后添加到链中的下一个。

要澄清的最大示例是加入其他表。每当加入时,您都会进行查询并为其分配别名引用。该别名是其余查询的基础。不要将别名与外部查询的子选择混淆。在不进行确切查询的情况下,请查看以下内容

SELECT 
      parent1.parent1_id, etc, etc, etc
   FROM 
      parent1
         LEFT JOIN 
         ( SELECT 
                 child1.child1_id, 
                 child1.child1_content
              FROM 
                 child1 
              WHERE 
                 child1.child1_id = parent1.child1_id ) CHILD1

小写的“child1”INNER 查询与上面示例的 OUTER 大写的“CHILD1”不同。我认为你想要得到的更多的是以下内容。另请注意,我正在应用 ALIASES 来帮助确认 ACTUAL 表名与任何可能是子查询条件之间的区别。

SELECT 
      P1.parent1_id, 
      C1.child1_content,
      C1X.child1_extrasID, 
      C1X.child1_extrasContent
   FROM 
      parent1 P1
         LEFT JOIN child1 C1
            on P1.child1_id = C1.child1_id
         LEFT JOIN child1_extras C1X
            on P1.child1_id = C1X.child1_id

请注意,每个附加表都是从可能的前一个表连接的。我还尝试始终让我的左侧表(查询中的第一个)加入或左加入到第二个别名结果键 ID。

尝试使用一些固定条件的上述简化示例查询,看看它是否有效。然后应用您的额外表连接、位置、排序依据、偏移量等。

【讨论】:

  • 注意:您对原始问题做了很多格式化。您实际上更正了第一个出现的语法错误LEFT JOIN child1 (SELECT
  • 对于上面的可怕问题和代码示例,我深表歉意,请阅读以下链接中我的新帖子页面底部的注释,您会发现我为什么会发布如此灾难性的帖子stackoverflow.com/questions/48912668/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2021-11-30
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
相关资源
最近更新 更多