【问题标题】:Using SELECT result in another SELECT使用 SELECT 导致另一个 SELECT
【发布时间】:2013-04-04 09:21:28
【问题描述】:

这是我的查询

SELECT 
    * 
FROM 
    Score  AS NewScores 
WHERE 
    InsertedDate >= DATEADD(mm, -3, GETDATE());


SELECT 
    ROW_NUMBER() OVER( ORDER BY NETT) AS Rank, 
    Name, 
    FlagImg, 
    Nett, 
    Rounds 
FROM (
    SELECT 
        Members.FirstName + ' ' + Members.LastName AS Name, 
        CASE 
            WHEN MenuCountry.ImgURL IS NULL THEN 
                '~/images/flags/ismygolf.png' 
            ELSE 
                MenuCountry.ImgURL 
        END AS FlagImg, 
        AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, 
        COUNT(Score.ScoreID) AS Rounds 
    FROM 
        Members 
        INNER JOIN 
        Score 
            ON Members.MemberID = Score.MemberID 
        LEFT OUTER JOIN MenuCountry 
            ON Members.Country = MenuCountry.ID 
    WHERE 
        Members.Status = 1 
    GROUP BY 
        Members.FirstName + ' ' + Members.LastName, 
        MenuCountry.ImgURL
    ) AS Dertbl 
ORDER BY;
    

查询是为基于 GridView 的排行榜提供一个结果集,我想要的是只获得不到 3 个月的分数的平均值。如您所见,我将其分为两部分,显然它给出了这样的错误。

消息 4104,第 16 级,状态 1,第 2 行

无法绑定多部分标识符“NewScores.NetScore”。

这是因为AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett

我怎样才能使我可以在那里使用NewScores,所以我只能获得不到 3 个月的平均分数?

编辑:使用人们提供的答案,我通过在正确的位置使用连接解决了这个问题,这是正确的查询:

SELECT ROW_NUMBER() OVER(ORDER BY NETT) AS Rank, Name, FlagImg, Nett, Rounds FROM (SELECT Members.FirstName + ' ' + Members.LastName AS Name, CASE WHEN MenuCountry.ImgURL IS NULL THEN '~/images/flags/ismygolf.png' ELSE MenuCountry.ImgURL END AS FlagImg, AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, COUNT(NewScores.ScoreID) AS Rounds FROM Members INNER JOIN (SELECT * FROM Score WHERE InsertedDate >= DATEADD(mm, -5, GETDATE())) NewScores ON Members.MemberID = NewScores.MemberID LEFT OUTER JOIN MenuCountry ON Members.Country = MenuCountry.ID WHERE Members.Status = 1 GROUP BY Members.FirstName + ' ' + Members.LastName, MenuCountry.ImgURL) AS Dertbl ORDER BY Nett ASC

【问题讨论】:

  • 我可以通过在 WHERE 子句的末尾添加日期条件来完成同样的事情,但我也想知道如何使用选择别名来做到这一点。
  • 你还没有加入表NewScores这就是为什么列NetScore无法定位。
  • 是的,我知道那部分,我正在尝试弄清楚如何在此查询中准确地加入它,以便它按照我想要的方式工作,到目前为止我尝试的加入失败了。

标签: sql select


【解决方案1】:

如果您的 dbms 支持,您正在寻找的是带有 WITH 子句的查询。那么

WITH NewScores AS (
    SELECT * 
    FROM Score  
    WHERE InsertedDate >= DATEADD(mm, -3, GETDATE())
)
SELECT 
<and the rest of your query>
;

注意前半部分没有;。 HTH。

【讨论】:

  • 您所说的 WITH 子句实际上称为“公用表表达式”。它的行为有点像仅在以下选择期间可用的临时表。这不是问题的答案,但我同意这将是 OP 情况的最佳解决方案。
【解决方案2】:

NewScores 是 Scores 表的别名 - 看起来您可以按如下方式组合查询:

SELECT 
    ROW_NUMBER() OVER( ORDER BY NETT) AS Rank, 
    Name, 
    FlagImg, 
    Nett, 
    Rounds 
FROM (
    SELECT 
        Members.FirstName + ' ' + Members.LastName AS Name, 
        CASE 
            WHEN MenuCountry.ImgURL IS NULL THEN 
                '~/images/flags/ismygolf.png' 
            ELSE 
                MenuCountry.ImgURL 
        END AS FlagImg, 
        AVG(CAST(NewScores.NetScore AS DECIMAL(18, 4))) AS Nett, 
        COUNT(Score.ScoreID) AS Rounds 
    FROM 
        Members 
        INNER JOIN 
        Score NewScores
            ON Members.MemberID = NewScores.MemberID 
        LEFT OUTER JOIN MenuCountry 
            ON Members.Country = MenuCountry.ID 
    WHERE 
        Members.Status = 1 
        AND NewScores.InsertedDate >= DATEADD(mm, -3, GETDATE())
    GROUP BY 
        Members.FirstName + ' ' + Members.LastName, 
        MenuCountry.ImgURL
    ) AS Dertbl 
ORDER BY;

【讨论】:

  • 基于他的原始 SQL,他有“FROM Score AS NewScores”
  • 感谢您告诉我正确的加入位置,我现在已经解决了问题。
【解决方案3】:

您缺少表NewScores,因此无法找到。只需加入此表即可。

如果您真的想避免直接加入,可以将NewScores.NetScore 替换为SELECT NetScore FROM NewScores WHERE {conditions on which they should be matched}

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多