【问题标题】:SQL Server query syntax (sub queries, brackets and CASE WHEN)SQL Server 查询语法(子查询、括号和 CASE WHEN)
【发布时间】:2015-11-26 12:33:07
【问题描述】:

我尝试在下面运行的查询有问题。我已经覆盖并关闭了所有括号,但 SQL Server 仍然突出显示

')' 附近的语法不正确。

AS REV的最后一个括号

SELECT 
    spot.spotid, rev.revenue 
FROM 
    [Media].[dbo].[T_MED_Spot] AS SPOT
INNER JOIN
    (SELECT 
         CASE 
            WHEN spot2.status = '4'
                THEN spotcc.mediacost * 5
            WHEN spot2.status IN ('7','8')
                THEN spotcc.mediacost * 20
         END AS revenue
     FROM
         (SELECT * 
          FROM [Media].[dbo].[T_MED_Spot] AS SPOT2
          INNER JOIN [Media].[dbo].[T_MED_SpotCalculation] AS SPOTCC ON spot2.spotid = spotcc.spotid)
    ) AS REV ON spot.spotid = rev.spotid

我在这里有点不知所措。我希望我想要实现的总体目标很明显,即使用 spotid 将 T_MED_Spot 表与名为 REV 的子查询进行内部连接。

谢谢

【问题讨论】:

  • 你不能在那里使用 spot2.status,不在范围内。
  • 您没有为您的内部查询设置别名。将)) AS REV 更改为) as T ) AS REV 然后在外壳中引用T 而不是spot2

标签: sql sql-server subquery inner-join case-when


【解决方案1】:
SELECT s.spotid, 
    CASE 
        WHEN s.[status] = '4' THEN c.mediacost * 5
        WHEN s.[status] IN ('7','8') THEN c.mediacost * 20
    END AS revenue
FROM [dbo].[T_MED_Spot] s
JOIN [dbo].[T_MED_SpotCalculation] c ON c.spotid = s.spotid

检查此查询...

【讨论】:

    【解决方案2】:

    这行得通吗:

    SELECT spot.spotid, rev.revenue 
    FROM [Media].[dbo].[T_MED_Spot] AS SPOT
    INNER JOIN
    (SELECT 
            CASE 
                WHEN T.status = '4'
                    THEN T.mediacost*5
                WHEN T.status IN ('7','8')
                    THEN T.mediacost*20
                END AS revenue, spotid
        FROM (SELECT * FROM [Media].[dbo].[T_MED_Spot] AS SPOT2
                INNER JOIN [Media].[dbo].[T_MED_SpotCalculation] AS SPOTCC 
    ON spot2.spotid = spotcc.spotid) AS T ) AS REV
    ON spot.spotid = rev.spotid
    

    你没有给你的内部查询起别名

    【讨论】:

    • Nick 不得不修改您的代码,因为我遇到了无效的列错误。 SELECT spot.spotid, rev.revenue FROM [Media].[dbo].[T_MED_Spot] AS SPOT INNER JOIN (SELECT CASE WHEN T.status = '4' THEN T.mediacost*5 WHEN T.status IN ('7','8') THEN T.mediacost*20 END AS revenue, * FROM (SELECT spot2.spotid, spot2.status, spotcc.mediacost FROM [Media].[dbo].[T_MED_Spot] AS SPOT2 INNER JOIN [Media].[dbo].[T_MED_SpotCalculation] AS SPOTCC ON spot2.spotid = spotcc.spotid) AS T) AS REV ON spot.spotid = rev.spotid
    • 看看我编辑的是否有效。它使用特定的列列表,而不是 *。 * 的一个问题是,例如,如果您将相同命名的列添加到不同的表中,您的选择将抛出一个不明确的列名错误并停止工作。
    【解决方案3】:

    您将第一个 INNER JOIN 子查询命名为 AS REV,但第二个子查询没有别名。

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多