【问题标题】:How to join the subquery result(having nested joins ) with another table?如何将子查询结果(具有嵌套连接)与另一个表连接?
【发布时间】:2019-07-31 03:49:33
【问题描述】:

我正在使用子查询实现嵌套连接语句。我能够得到 3 个表的结果,但无法进一步加入 4 个或 n 个表的结果。

SELECT X.personCityId
     , X.name
     , X.age
     , X.cityId
     , X.state
     , Y.age 
     , Y.name 
  FROM (SELECT Person.cityId AS personCityId
             , Person.name
             , Person.age
             , CityDetails.cityId AS cityId
             , CityDetails.state 
          FROM Person 
               LEFT JOIN CityDetails 
                      ON Person.cityid = CityDetails.cityid ) AS X 
        LEFT JOIN (SELECT name , age, lastname FROM PersonalDetails) AS Y 
               ON X.age=Y.age

假设我是否必须通过age 列上的左连接将上述查询的结果与第四个表连接

LEFT JOIN (SELECT age,height, weight from PersonMedicalRecords ) as D ON Z.age = a.age

我想知道如何仅通过子查询来完成。

【问题讨论】:

  • LEFT JOIN (SELECT age,height, weight from PersonMedicalRecords ) as D ON Z.age = a.ageLEFT JOIN PersonMedicalRecords as D ON Z.age = a.age 完全一样,子查询没用。不需要您的任何子查询。为什么不直接加入表格?这使得查询方式更易于阅读和理解

标签: sql join subquery


【解决方案1】:

您可以使用“通用表表达式”来实现这一点并保持层次结构 像这样

; 
WITH cte AS (
         SELECT Person.cityId AS personCityId
              , Person.name
              , Person.age
              , CityDetails.cityId AS cityId
              , CityDetails.state 
           FROM Person 
                LEFT JOIN CityDetails 
                       ON Person.cityid = CityDetails.cityid )
   , ct AS ( 
        SELECT *                    ----- here on * use your required column
          FROM (SELECT *            ----- here on * use your required column
                  FROM cte) AS x 
               LEFT JOIN (SELECT name 
                               , age
                               , lastname 
                           FROM PersonalDetails) as y 
                      ON X.age=y.age )  
   , ct2 AS ( 
         SELECT *                  ----- here on * use your required column
           FROM (SELECT *          ----- here on * use your required column
                   FROM ct) as y 
                LEFT JOIN (SELECT height 
                                , weight 
                                , age    ---- added from our side considering it is available for implementing join on age
                             FROM PersonMedicalRecords) as z 
                       ON y.age=z.age )   
SELECT * FROM ct2   ----- here on * use your required column

这里一个left join 的输出将与下一个join 作为输入表,同样您可以维护join 的层次结构。

【讨论】:

  • cte 表中的额外选择(如xy)是不必要的 - 只需将 cte 表直接放在 from 子句中即可。此外,您可以通过将最里面的选择进一步向外移动来进一步简化查询。这也将解决问题,在您编写的查询中,在 z 中没有选择 age 列加入,因为它被过滤得太早了。
  • op 愿意在我们的问题中进行 n 次连接,并且以这种方式维护子查询很难维护,这将单独创建每个连接。此外,这只是执行此任务的另一种选择,对于不在 z 中的年龄列的情况,它在他的输入查询中......让我通过考虑 PersonMedicalRecords 表中可用的年龄来更新
【解决方案2】:

您不必要地嵌套查询。你应该把你的查询写成:

SELECT p.cityId as personCityId, p.name, p.age, 
       cd.cityId, cd.state,
       pd.age, pd.name 
FROM Person p LEFT JOIN
     CityDetails cd
     ON p.cityid = cd.cityid LEFT JOIN
     PersonalDetails pd
     ON pd.age = p.age;

注意使用有意义的表别名(表名的缩写)而不是任意字母。此外,没有子查询。

如果您想添加另一个JOIN,只需添加另一个JOIN,遵循其他连接的模式。

【讨论】:

  • 我有理由把它写成子查询格式。我的缓存是分布式的。我们使用的是不支持非并置嵌套连接的 Ignite 平台。所以必须提出子查询,一次只有一个连接功能。
  • 要实现分布式连接,要么我们必须有一个嵌套连接的关联键,要么选择这种实现方式。
【解决方案3】:

**我试过了,效果很好

SELECT X.personCityId, X.name, X.age, X.cityId, X.state, Y.age FROM (SELECT Person.cityId AS personCityId, Person.name, Person.age, CityDetails.cityId AS cityId, CityDetails.state FROM Person LEFT JOIN CityDetails ON Person.cityid = CityDetails.cityid) AS X LEFT JOIN (SELECT age, lastname FROM PersonalDetails) AS Y ON X.age=Y.age LEFT JOIN (SELECT age, height, weight FROM PersonMedicalRecords )AS Z ON Y.age = Z.age


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2015-07-16
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多