【问题标题】:Joining Two Subqueries That Contain A Subquery连接两个包含子查询的子查询
【发布时间】:2018-12-02 12:17:35
【问题描述】:

还是 SQL 的新手。我已经四处寻找答案,我找到的例子,我已经镜像了我的查询,看起来像例子,但这个查询仍然不起作用。我要做的就是加入两个子查询,但是这两个子查询都包含一个子查询。我收到以下错误:

消息 156,级别 15,状态 1,第 26 行 关键字“On”附近的语法不正确。

这是查询,请帮忙,谢谢。

Select *
From 
(
Select * From(
Select x.ID, x.Date, x.USOHist, x.OVXHist,
Abs(Cast((((x.USOHist / NullIf((y.USOHist),0))-1)*100) as Decimal(10,2)))         AS '%USOH',
Abs(Cast((((x.OVXHist / NullIf((y.OVXHist),0))-1)*100) as Decimal(10,2)))   AS '%OVXH'
From (Select a.Date as aDate, Max(b.Date) As aPrevDate From USO_OVX_Hist a      Inner Join USO_OVX_Hist b on a.Date > b.Date
Group By a.Date) Sub1
Inner Join USO_OVX_Hist x on Sub1.aDate = x.Date
Inner Join USO_OVX_Hist y on Sub1.aPrevDate = y.Date
) Sub2

Inner Join 
(
Select * From(
Select z.ID, z.ID2, z.Date, z.USO as USOP, z.OVX as OVXP,
Cast(((z.USO / NullIf((q.USO),0)- 1) * 100) as Decimal(10,2)) AS '%USOP',
Cast(((z.OVX / NullIf((q.OVX),0)- 1) * 100) as Decimal(10,2)) AS '%OVXP'
From (Select c.Date as cDate, Max(d.Date) As cPrevDate From USO_OVX_Price     c Inner Join USO_OVX_Price d on c.Date > d.Date
Group By c.Date) Sub3
Inner Join USO_OVX_Price z on Sub3.cDate = z.Date
Inner Join USO_OVX_Price q on Sub3.cPrevDate = q.Date
) Sub4 

On Sub2.Date = Sub4.Date

【问题讨论】:

    标签: sql sql-server subquery inner-join


    【解决方案1】:

    sub2sub4 之前添加右括号以及新别名t2t4

    select * from 
    (
    Select * From(
    Select x.ID, x.Date, x.USOHist, x.OVXHist,
    Abs(Cast((((x.USOHist / NullIf((y.USOHist),0))-1)*100) as Decimal(10,2)))         AS '%USOH',
    Abs(Cast((((x.OVXHist / NullIf((y.OVXHist),0))-1)*100) as Decimal(10,2)))   AS '%OVXH'
    From (Select a.Date as aDate, Max(b.Date) As aPrevDate From USO_OVX_Hist a      Inner Join USO_OVX_Hist b on a.Date > b.Date
    Group By a.Date) Sub1
    Inner Join USO_OVX_Hist x on Sub1.aDate = x.Date
    Inner Join USO_OVX_Hist y on Sub1.aPrevDate = y.Date
    )  t2 ) sub2
    
    Inner Join 
    (
    Select * From (
    Select z.ID, z.ID2, z.Date, z.USO as USOP, z.OVX as OVXP,
    Cast(((z.USO / NullIf((q.USO),0)- 1) * 100) as Decimal(10,2)) AS '%USOP',
    Cast(((z.OVX / NullIf((q.OVX),0)- 1) * 100) as Decimal(10,2)) AS '%OVXP'
    From (Select c.Date as cDate, Max(d.Date) As cPrevDate From USO_OVX_Price     c Inner Join USO_OVX_Price d on c.Date > d.Date
    Group By c.Date) Sub3
    Inner Join USO_OVX_Price z on Sub3.cDate = z.Date
    Inner Join USO_OVX_Price q on Sub3.cPrevDate = q.Date
    )  t4 ) sub4
    
    On sub2.Date = sub4.Date
    

    【讨论】:

      【解决方案2】:

      使用以下内容:

      SELECT *
      FROM 
          (
              SELECT *
              FROM 
                  (
                      SELECT
                        x.id,
                        x.date,
                        x.usohist,
                        x.ovxhist,
                        ABS(CAST((((x.usohist / NULLIF((y.usohist), 0)) - 1) * 100) AS decimal(10, 2))) AS '%USOH',
                        ABS(CAST((((x.ovxhist / NULLIF((y.ovxhist), 0)) - 1) * 100) AS decimal(10, 2))) AS '%OVXH'
                      FROM 
                          (
                              SELECT
                                a.date AS adate,
                                MAX(b.date) AS aprevdate
                              FROM uso_ovx_hist a
                              INNER JOIN uso_ovx_hist b
                                ON a.date > b.date
                              GROUP BY a.date
                          ) Sub1
                      INNER JOIN uso_ovx_hist x
                          ON sub1.adate = x.date
                      INNER JOIN uso_ovx_hist y
                          ON sub1.aprevdate = y.date
                  ) Sub2
              INNER JOIN 
                  (SELECT * FROM 
                      (
                          SELECT
                            z.id,
                            z.id2,
                            z.date,
                            z.uso AS usop,
                            z.ovx AS ovxp,
                            CAST(((z.uso / NULLIF((q.uso), 0) - 1) * 100) AS decimal(10, 2)) AS '%USOP',
                            CAST(((z.ovx / NULLIF((q.ovx), 0) - 1) * 100) AS decimal(10, 2)) AS '%OVXP'
                          FROM 
                              (SELECT
                                c.date AS cdate,
                                MAX(d.date) AS cprevdate
                              FROM uso_ovx_price c
                              INNER JOIN uso_ovx_price d
                                ON c.date > d.date
                              GROUP BY c.date) Sub3
                              INNER JOIN uso_ovx_price z
                                ON sub3.cdate = z.date
                              INNER JOIN uso_ovx_price q
                                ON sub3.cprevdate = q.date
                      ) Sub4
                  ) t
              ON sub2.date = t.date
          ) t2
      

      您可以使用在线 Instant SQL Formatter 来格式化您的 SQL。


      谢谢,效果很好。我很难理解添加别名以使连接起作用的意义。你介意给我解释一下吗?我对 SQL 还是有点陌生​​。另外,我究竟如何在该查询上创建更多子查询或加入另一个表?

      另一个:InnerJoin NYSEData on Sub4.Date = NYSEData.Date

      我收到一条错误消息,指出无法绑定 Sub4 对象?

      我知道我需要在查询中添加另一个 select 和 from 标准才能添加另一个表或子查询?请帮忙,谢谢。

      【讨论】:

      • 新的怎么样..?
      • 谢谢,效果很好。抱歉格式化:)
      猜你喜欢
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2011-12-03
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多