【问题标题】:I am getting this error "The multi-part identifier "DCOT.Loyalty" could not be bound."我收到此错误“无法绑定多部分标识符“DCOT.Loyalty”。”
【发布时间】:2021-07-30 18:55:44
【问题描述】:

我正在编写这段代码,用于将忠诚度和获取列设置为 0 或 1。我收到一个错误:

无法绑定多部分标识符“DCOT.Loyalty”

我在这里做错了什么?在我看来,连接存在一些问题。有人可以为我纠正这个问题吗?

DECLARE @CustomerSKID int
SET @CustomerSKID = (SELECT COUNT(CustomerSKID) 
                    FROM Dim.DimCustomerOwnedTractor)

WHILE (@CustomerSKID) > 1
BEGIN
    IF OBJECT_ID('tempdb..#Mintable1') IS NOT NULL
    BEGIN
        DROP TABLE #Mintable1
    END

    IF OBJECT_ID('tempdb..#Mintable2') IS NOT NULL
    BEGIN
        DROP TABLE #Mintable2
    END

    SELECT 
        CustomerSKID, MIN(PurchaseDate) AS MinPDate 
    INTO 
        #Mintable1 
    FROM 
        Dim.DimCustomerOwnedTractor 
    WHERE 
        ManufacturerName = 'Mahindra' 
    GROUP BY
        CustomerSKID
                        
    SELECT CustomerSKID 
    INTO #Mintable2 
    FROM #Mintable1 
    WHERE MinPDate IS NOT NULL

    UPDATE Dim.DimCustomerOwnedTractor
    SET DCOT.Loyalty = 1
    FROM Dim.DimCustomerOwnedTractor DCOT
    LEFT OUTER JOIN #Mintable2 AS M2 ON DCOT.CustomerSKID = M2.CustomerSKID
                                     AND DCOT.ManufacturerName = 'Mahindra'

    IF OBJECT_ID('tempdb..#Mintable3') IS NOT NULL
    BEGIN
        DROP TABLE #Mintable3
    END

    IF OBJECT_ID('tempdb..#Mintable4') IS NOT NULL
    BEGIN
        DROP TABLE #Mintable4
    END

    SELECT CustomerSKID, MAX(PurchaseDate) AS MaxPDate 
    INTO #Mintable3 
    FROM Dim.DimCustomerOwnedTractor 
    WHERE ManufacturerName = 'Mahindra' 
    GROUP BY CustomerSKID
                        
    SELECT CustomerSKID 
    INTO #Mintable4 
    FROM #Mintable3 
    WHERE MaxPDate IS NOT NULL

    UPDATE Dim.DimCustomerOwnedTractor
    SET DCOT.Acquisition = 1
    FROM Dim.DimCustomerOwnedTractor DCOT
    LEFT OUTER JOIN #Mintable2 AS M2 ON DCOT.CustomerSKID = M2.CustomerSKID
    LEFT OUTER JOIN #Mintable4 AS M4 ON DCOT.CustomerSKID = M4.CustomerSKID
    LEFT OUTER JOIN #Mintable3 AS M3 ON DCOT.CustomerSKID = M3.CustomerSKID
                                     AND DCOT.ManufacturerName = 'Mahindra'
                                     AND DCOT.PurchaseDate = M3.MaxPDate

    UPDATE Dim.DimCustomerOwnedTractor
    SET DCOT.Acquisition = 0
    FROM Dim.DimCustomerOwnedTractor DCOT
    LEFT OUTER JOIN #Mintable1 AS M1 ON DCOT.CustomerSKID = M1.CustomerSKID
    LEFT OUTER JOIN #Mintable4 AS M4 ON DCOT.CustomerSKID = M4.CustomerSKID 
                                     AND DCOT.ManufacturerName != 'Mahindra'
                                     AND DCOT.PurchaseDate = M1.MinPDate
END

【问题讨论】:

    标签: sql sql-server azure-sql-database azure-sql-data-warehouse


    【解决方案1】:

    您的 UPDATE 应该引用您的别名,例如 UPDATE DCOT,或者您可以从集合中删除别名,例如 SET Loyalty = 1

    由于不匹配,您要求 SQL 更新名为 Dim.DimCustomerOwnedTractor 的表,并告诉 SQL 使用 DCOT 而不是该名称。

    【讨论】:

      【解决方案2】:

      SQL Server 中正确的表别名用法是

      UPDATE DCOT
      SET DCOT.Loyalty = 1
      FROM Dim.DimCustomerOwnedTractor DCOT
      ..
      

      在 FROM 子句中分配给Dim.DimCustomerOwnedTractor 的表别名在 UPDATE 子句中被指定为目标对象。

      您也可以在 SET 子句中省略表别名

      UPDATE DCOT
      SET Loyalty = 1
      FROM Dim.DimCustomerOwnedTractor DCOT
      ..
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-16
        • 2018-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多