【问题标题】:Sql Server CTE "multi- part identifier could not be bound."Sql Server CTE“无法绑定多部分标识符”。
【发布时间】:2012-01-03 23:24:26
【问题描述】:

我在同一个 cte 查询上的最后一个问题很快就得到了回答,我想我会从你的 sql 专家那里退回下一个问题。如果我能回顾一下我的基本逻辑,然后显示我的代码和语法错误,任何帮助将不胜感激..

我有三个用于股票交易系统的表:一个符号表:顾名思义,它是一个股票代码列表,一个每日定价/交易量表:同样,如上所述,每条记录都有一个日期字段和符号字段以及定价信息,最后是交易日期表:我们查询中所有交易日期的参考。

我想返回一个包含两个字段的记录集:一个符号和一个日期。该货币对代表在定价量表中没有该交易品种的相应定价/交易量数据的所有交易日期和交易品种。有道理?在我的查询中,我收到错误消息:“无法绑定多部分标识符“Symb.Symbol”。”这是我的 cte 查询:

WITH Symb AS
(
     SELECT Symbol
     FROM tblSymbolsMain
),

DatesNotNeeded AS
(
     SELECT Date
     FROM tblDailyPricingAndVol
     WHERE (tblDailyPricingAndVol.Symbol = Symb.Symbol)
),

WideDateRange AS
(
     SELECT TradingDate
     FROM tblTradingDays
     WHERE (TradingDate >= dbo.NextAvailableDataDownloadDateTime()) AND (TradingDate <= dbo.LatestAvailableDataDownloadDateTime())
),

DatesNeeded AS
(
     SELECT TradingDate
     FROM WideDateRange wdr
     WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded)
)

SELECT Symb.Symbol, DatesNeeded.TradingDate
FROM Symb CROSS JOIN DatesNeeded

【问题讨论】:

    标签: sql-server common-table-expression


    【解决方案1】:

    这个:

    DatesNotNeeded AS
    (
         SELECT Date
         FROM tblDailyPricingAndVol
         WHERE (tblDailyPricingAndVol.Symbol = Symb.Symbol)
    ),
    

    需要这样:

    DatesNotNeeded AS
    (
         SELECT Date
         FROM tblDailyPricingAndVol inner join Symb on
             tblDailyPricingAndVol.Symbol = Symb.Symbol
    ),
    

    但是您的查询仍然不起作用,因为:

    DatesNeeded AS
    (
         SELECT TradingDate
         FROM WideDateRange wdr
         WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded)
    )
    

    需要这样:

    DatesNeeded AS
    (
         SELECT TradingDate
         FROM WideDateRange wdr
         WHERE NOT EXISTS (SELECT * FROM DatesNotNeeded d where d.Date = wdr.TradingDate)
    )
    

    但实际上,您可以在没有 CTE 的情况下执行此操作,如下所示:

    select
        sm.Symbol,
        tb.TradingDate
    from
        tblSymbolsMain sm
        cross join tblTradingDays tb
        left join tblDailyPricingAndVol dp on
            sm.Symbol = dp.Symbol 
            and tb.TradingDate = dp.Date
    where
        tb.TradingDate between 
            dbo.LatestAvailableDataDownloadDateTime()
            and dbo.NextAvailableDataDownloadDatetime()
        and dp.Date is null
    

    此查询从tblSymbolsMain 中获取所有符号,并从tblTradingDays 中获取您最后一个可用日期和下一个可用日期之间的所有日期。然后它在tblDailyPricingAndVol 上执行left join 并过滤掉任何找到匹配项的行。

    您也可以使用not exists 代替left join,我认为这也更清楚一点:

    select
        sm.Symbol,
        tb.TradingDate
    from
        tblSymbolsMain sm
        cross join tblTradingDays tb
    where
        tb.TradingDate between 
            dbo.LatestAvailableDataDownloadDateTime() 
            and dbo.NextAvailableDataDownloadDatetime()
        and not exists (
            select
                1
            from
                tblDailyPricingAndVol dp
            where
                dp.Symbol = sm.Symbol
                and dp.Date = tb.TradingDate
        )
    

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2013-06-23
      • 2019-01-26
      • 1970-01-01
      相关资源
      最近更新 更多