从获得加入无连接的语法特定的列?

问题描述 投票:0回答:3

有另一种方式来写这个?

SELECT src.ID, factDeviceBuild.ID
    FROM #factDeviceBuild as src
    INNER JOIN AppsFlyer.FactDeviceBuild AS factDeviceBuild
    ON src.[DimDevice_Id] = factDeviceBuild.[DimDevice_Id] AND
        src.[DimDeviceModel_Id] = factDeviceBuild.[DimDeviceModel_Id] AND
        src.[DimPlatform_Id] = factDeviceBuild.[DimPlatform_Id] AND
        src.[DimOSVersion_Id] = factDeviceBuild.[DimOSVersion_Id] AND
        src.[DimSDKVersion_Id] = factDeviceBuild.[DimSDKVersion_Id] AND
        src.[DimCarrier_Id] = factDeviceBuild.[DimCarrier_Id] AND
        src.[DimOperator_Id] = factDeviceBuild.[DimOperator_Id]

我一直在尝试做一些不同的事情(不工作)这样的

SELECT *, factDeviceBuild.ID
    FROM #factDeviceBuild
    WHERE EXISTS (
        SELECT [DimDevice_Id], [DimDeviceModel_Id], [DimPlatform_Id],
            [DimOSVersion_Id], [DimSDKVersion_Id], [DimCarrier_Id],
            [DimOperator_Id]
        FROM AppsFlyer.FactDeviceBuild AS factDeviceBuild
        )

或者是这样的(也不起作用):

SELECT factDeviceBuild.ID, 
        factDeviceBuild.[ID]
    FROM (
        SELECT [DimDevice_Id], [DimDeviceModel_Id], [DimPlatform_Id],
            [DimOSVersion_Id], [DimSDKVersion_Id], [DimCarrier_Id],
            [DimOperator_Id]
        FROM AppsFlyer.FactDeviceBuild AS factDeviceBuild
        INTERSECT
        SELECT [DimDevice_Id], [DimDeviceModel_Id], [DimPlatform_Id],
            [DimOSVersion_Id], [DimSDKVersion_Id], [DimCarrier_Id],
            [DimOperator_Id]
        FROM AppsFlyer.#factDeviceBuild AS factDeviceBuild
    ) AS A

我只是玩弄一些查询优化。 EXCEPTINTERSECT是因为他们对待NULLS的方式特别有趣。

很显然,我可以使用CROSS JOINOUTER JOIN构建我INNER JOIN形式划伤,但我没有看到一个具体的增益那里。

sql-server tsql
3个回答
2
投票

我相信你正在寻找的东西是这样的:

SELECT src.ID, fact.ID
FROM #factDeviceBuild as src
INNER JOIN AppsFlyer.FactDeviceBuild AS fact
ON EXISTS (
    SELECT src.DimDevice_Id, src.DimDeviceModel_Id, src.DimPlatform_Id,
        src.DimOSVersion_Id, src.DimSDKVersion_Id, src.DimCarrier_Id,
        src.DimOperator_Id
    INTERSECT
    SELECT fact.DimDevice_Id, fact.DimDeviceModel_Id, fact.DimPlatform_Id,
        fact.DimOSVersion_Id, fact.DimSDKVersion_Id, fact.DimCarrier_Id,
        fact.DimOperator_Id
)

使用此INTERSECT语法(而不是通常的条件)具有治疗NULL-S为相同的值的优点。例如,如果只有DimCarrier_IdDimOperator_Id列将允许NULL-S,等效条件需要是:

SELECT src.ID, fact.ID
FROM #factDeviceBuild as src
INNER JOIN AppsFlyer.FactDeviceBuild AS fact
ON src.DimDevice_Id = fact.DimDevice_Id AND
    src.DimDeviceModel_Id = fact.DimDeviceModel_Id AND
    src.DimPlatform_Id = fact.DimPlatform_Id AND
    src.DimOSVersion_Id = fact.DimOSVersion_Id AND
    src.DimSDKVersion_Id = fact.DimSDKVersion_Id AND
    (src.DimCarrier_Id = fact.DimCarrier_Id OR src.DimCarrier_Id IS NULL AND fact.DimCarrier_Id IS NULL) AND
    (src.DimOperator_Id = fact.DimOperator_Id OR src.DimOperator_Id IS NULL AND fact.DimOperator_Id IS NULL)

0
投票

以下是相同的

SELECT src.ID, factDeviceBuild.ID
    FROM #factDeviceBuild as src, AppsFlyer.FactDeviceBuild AS factDeviceBuild
    WHERE
        src.[DimDevice_Id] = factDeviceBuild.[DimDevice_Id] AND
        src.[DimDeviceModel_Id] = factDeviceBuild.[DimDeviceModel_Id] AND
        src.[DimPlatform_Id] = factDeviceBuild.[DimPlatform_Id] AND
        src.[DimOSVersion_Id] = factDeviceBuild.[DimOSVersion_Id] AND
        src.[DimSDKVersion_Id] = factDeviceBuild.[DimSDKVersion_Id] AND
        src.[DimCarrier_Id] = factDeviceBuild.[DimCarrier_Id] AND
        src.[DimOperator_Id] = factDeviceBuild.[DimOperator_Id]

0
投票

如果没有数据或预期结果的可视化,我的猜测是,你需要“逆透视” 7种ID类型分为少列,从而降低了连接语法的复杂性。例如。:

select
     src.id, f.fact_id, ca.id_type, ca.id_value
from #factDeviceBuild as src
cross apply (
    values
       ('DimDevice_Id',src.[DimDevice_Id])
      ,('DimDeviceModel_Id',src.[DimDeviceModel_Id])
      ,('DimPlatform_Id',src.[DimPlatform_Id])
      ,('DimOSVersion_Id',src.[DimOSVersion_Id])
      ,('DimSDKVersion_Id',src.[DimSDKVersion_Id])
      ,('DimCarrier_Id',src.[DimCarrier_Id])
      ,('DimOperator_Id',src.[DimOperator_Id])
    ) ca (id_type, id_value)
inner join (
    select
         fact.id fact_id, ca.id_type, ca.id_value
    from AppsFlyer.FactDeviceBuild AS fact
    cross apply (
        values
           ('DimDevice_Id',fact.[DimDevice_Id])
          ,('DimDeviceModel_Id',fact.[DimDeviceModel_Id])
          ,('DimPlatform_Id',fact.[DimPlatform_Id])
          ,('DimOSVersion_Id',fact.[DimOSVersion_Id])
          ,('DimSDKVersion_Id',fact.[DimSDKVersion_Id])
          ,('DimCarrier_Id',fact.[DimCarrier_Id])
          ,('DimOperator_Id',fact.[DimOperator_Id])
        ) ca (id_type, id_value)
    where ca.id_value IS NOT NULL
    ) as f on ca.id_type = f.id_type and ca.id_value = f.id_value

请注意我没有使用T-SQL的“逆透视”功能,因为我更喜欢你在上面看到的语法。使用此apply/values语法时,有没有额外的性能劣势。

注意:这些ID类型列的所有7个必须是“兼容”的数据类型为“逆透视”没有错误的工作。所有7整数,例如,这将使得id_value整数的列。

© www.soinside.com 2019 - 2024. All rights reserved.