【问题标题】:SQL Trouble with correlated subquery相关子查询的 SQL 问题
【发布时间】:2018-01-17 08:45:27
【问题描述】:

我有这个 SQL 查询:

SELECT
  HALLS_REGISTRATION.ID,
  (
    CAST(
        (SELECT
           HALLS_REGISTRATION.MONEY_RECEIVED_NUMERIC
         FROM
           HALLS_REGISTRATION
         WHERE
           HALLS_REGISTRATION.ID = 2)
        AS DECIMAL
    )
    +
    (SELECT
       SUM(
           CAST(
               HALLS_REGISTRATION_PAID.PAID_MONEY
               AS DECIMAL
           )
       )
     FROM
       HALLS_REGISTRATION_PAID
     WHERE
       HALLS_REGISTRATION_PAID.REGISTRATION_ID = HALLS_REGISTRATION.ID
    )
  )
FROM HALLS_REGISTRATION;

这很好用,但这不是我想要的。我想要的是用从外部选择返回的HALLS_REGISTRATION.ID 替换第 10 行的2,所以当我尝试这种方法时,

SELECT
  HALLS_REGISTRATION.ID,
  (
    CAST(
        (SELECT
           HALLS_REGISTRATION.MONEY_RECEIVED_NUMERIC
         FROM
           HALLS_REGISTRATION
         WHERE
           HALLS_REGISTRATION.ID = ROOT.HALLS_REGISTRATION.ID)
        AS DECIMAL
    )
    +
    (SELECT
       SUM(
           CAST(
               HALLS_REGISTRATION_PAID.PAID_MONEY
               AS DECIMAL
           )
       )
     FROM
       HALLS_REGISTRATION_PAID
     WHERE
       HALLS_REGISTRATION_PAID.REGISTRATION_ID = HALLS_REGISTRATION.ID
    )
  )
FROM HALLS_REGISTRATION AS ROOT;

DataGrip 将 Root 视为未解析的符号,我在执行时收到此错误

[42S22][42122] 未找到列“HALLS_REGISTRATION.ID”; SQL 声明:

我希望查询与 H2、MySQL 或两者兼容。

【问题讨论】:

标签: mysql sql h2


【解决方案1】:

这个:

SELECT
  HALLS_REGISTRATION.ID,
  (
    CAST(
        (SELECT
           HALLS_REGISTRATION.MONEY_RECEIVED_NUMERIC
         FROM
           HALLS_REGISTRATION, HALLS_REGISTRATION_PAID
         WHERE
           WHERE
       HALLS_REGISTRATION_PAID.REGISTRATION_ID = HALLS_REGISTRATION.ID)
        AS DECIMAL
    )
    +
    (SELECT
       SUM(
           CAST(
               HALLS_REGISTRATION_PAID.PAID_MONEY
               AS DECIMAL
           )
       )
     FROM
       HALLS_REGISTRATION_PAID
     WHERE
       HALLS_REGISTRATION_PAID.REGISTRATION_ID = HALLS_REGISTRATION.ID
    )
  )
FROM HALLS_REGISTRATION;

可能会做你想做的事。

【讨论】:

  • 这实际上给了我这个错误标量子查询包含多行; SQL 语句:但是感谢您花时间在上面!
【解决方案2】:

错误消息不是关于ROOT,而是第二个子SELECT

SELECT
  ROOT.ID,
  (
    CAST(
        (SELECT
           HALLS_REGISTRATION.MONEY_RECEIVED_NUMERIC
         FROM
           HALLS_REGISTRATION
         WHERE
           HALLS_REGISTRATION.ID = ROOT.ID)
        AS DECIMAL
    )
    +
    (SELECT
       SUM(
           CAST(
               PAID_MONEY
               AS DECIMAL
           )
       )
     FROM
       HALLS_REGISTRATION_PAID
     WHERE
       REGISTRATION_ID = ROOT.ID
    )
  )
FROM HALLS_REGISTRATION AS ROOT;

我不确定,您是否需要所有这些子查询...

试试这样的:

SELECT r.id, r.money_received_numeric + SUM(p.paid_money)
FROM halls_registration AS r
LEFT JOIN halls_registration_paid AS p ON r.id = p.registration_id
GROUP BY r.id;

【讨论】:

  • 这第一个给出了同样的错误,但第二个像魅力一样工作,更简单,谢谢!