Что не так с этим запросом доступа? - PullRequest
0 голосов
/ 09 октября 2019

Выполнение запроса ниже возвращает 0 записей, но я ожидаю, что он вернет 3.

SELECT
    ID,
    DW2_TV_DimStation_Id,
    DW2_OTT_DimStation_Id,
    Name,
    CoreTVCode,
    CoreOTTCode,
    StrataTVCode,
    HouseHolds,
    MaleSkew,
    FemaleSkew,
    AverageAge,
    AverageIncome,
    BroadReach,
    Description,
    Owner,
    Notes,
    timestamp,
    CreatedOn,
    ModifiedOn,
    Retired,
    1 AS Accepted
FROM
    Planning_DimStation AS src
WHERE
    src.[timestamp] = (
        SELECT
            MAX([timestamp])
        FROM
            Planning_DimStation AS src2
        WHERE
            src2.[ID] = src.[ID]
    )
    AND NOT EXISTS (
        SELECT
            1 
        FROM
            DimStation AS tgt
        WHERE
            tgt.[ID] = src.[ID]
    );

Часть, которая нарушает его, - это оператор NOT EXISTS. Если я удаляю NOT EXISTS, он работает нормально.

  • Таблица 1: Planning_DimStation
    • Таблица SQL связана с 3 записями в ней. Источник ниже.
  • Таблица 2: DimStation
    • Является ли таблица доступа (рис. Ниже для пользовательского интерфейса источника) пустой,

Может ли это быть тихим отказом, вызванным несоответствием типов?

Таблица 1:

    CREATE TABLE [Planning].[DimStation]
    (
        [ID] INT PRIMARY KEY,
        [DW2_TV_DimStation_Id] INT NULL,
        [DW2_OTT_DimStation_Id] INT NULL,
        [Name] NVARCHAR(128) NOT NULL,
        [CoreTVCode] CHAR(5) NULL,
        [CoreOTTCode] CHAR(10) NULL,
        [StrataTVCode] CHAR(10) NULL,
        [HouseHolds] DECIMAL(5,2) NULL,
        [MaleSkew] DECIMAL(5,2) NULL,
        [FemaleSkew] DECIMAL(5,2) NULL,
        [AverageAge] INT NULL,
        [AverageIncome] DECIMAL(23,2) NULL,
        [BroadReach] BIT NULL,
        [Description] NVARCHAR(MAX) NULL,
        [Owner] NVARCHAR(128) NULL,
        [Notes] NVARCHAR(MAX) NULL,
        [timestamp] timestamp NOT NULL,
        [CreatedOn] DATETIME2(7) CONSTRAINT [df_Planning_DimStation_CreatedOn] DEFAULT (sysutcdatetime()) NOT NULL,
        [ModifiedOn] DATETIME2(7) CONSTRAINT [df_Planning_DimStation_ModifiedOn] DEFAULT (sysutcdatetime()) NOT NULL,
        [Retired] BIT CONSTRAINT [df_Planning_DimStation_Retired] DEFAULT (0) NOT NULL
    )
    GO

Таблица 2:

enter image description here

1 Ответ

1 голос
/ 09 октября 2019

Объединение разных типов данных приводит к неожиданным результатам. Чтобы исправить это, используйте приведение.

Обратите внимание, что Access не разрешает приводить нули. Поэтому нам нужно обойти это, используя Nz (то же самое, что и ISNULL в T-SQL) и явно обрабатывая нули.

AND NOT EXISTS (
    SELECT
        1 
    FROM
        DimStation AS tgt
    WHERE
        CLng(IIF(tgt.[ID] IS NULL, 0, tgt.ID)) = src.[ID] AND NOT tgt.ID IS NULL
);
...