Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 不使用联接语法从联接中获取特定列?_Sql Server_Tsql - Fatal编程技术网

Sql server 不使用联接语法从联接中获取特定列?

Sql server 不使用联接语法从联接中获取特定列?,sql-server,tsql,Sql Server,Tsql,还有别的方法写这个吗 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

还有别的方法写这个吗

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
        )
或者像这样(也不起作用):

我只是在玩一些查询调优<代码>除和
相交
特别有趣,因为它们处理
空值的方式

显然,我可以使用
交叉连接
外部连接
来构建我的
内部连接
表单scratch,但我看不到有什么特别的好处。

以下是相同的

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]
以下是相同的

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]

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

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\u Id
DimOperator\u 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)

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

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\u Id
DimOperator\u 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)

如果没有数据或预期结果的可视化,我猜您需要将7个id类型“unpivot”到更少的列中,这降低了连接语法的复杂性。e、 g:

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
注意我没有使用TSQL的“unpivot”特性,因为我更喜欢上面的语法。使用此
apply/values
语法时没有额外的性能缺点


注意:所有7个id类型列都必须是“兼容”数据类型,“unpivot”才能正常工作。例如,所有7个都是整数,这将使
id\u值成为一列整数。

如果没有数据或预期结果的可视化,我猜您需要将7个id类型“unpivot”到较少的列中,从而降低联接语法的复杂性。e、 g:

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
注意我没有使用TSQL的“unpivot”特性,因为我更喜欢上面的语法。使用此
apply/values
语法时没有额外的性能缺点


注意:所有7个id类型列都必须是“兼容”数据类型,“unpivot”才能正常工作。例如,所有7都是整数,这将使
id\u值成为整数列。

您试图实现什么?您可以使用
EXISTS
进行写入,但您当前的联接没有问题。可能会显示一些示例数据。您是否确实有需要7个ID值进行匹配的信息?(可能不是)因此,看起来您需要“取消PIVOT”数据以使关系更易于处理。您试图实现什么?您可以使用
EXISTS
进行编写,但您当前的连接没有问题。可能会显示一些示例数据。您是否确实有需要7个ID值进行匹配的信息?(可能不是)所以看起来你需要“取消Pivot”数据,以使关系更容易处理。Brilliant,这正是我所期待的Brilliant,这正是我所期待的这里不涉及旋转,它只是用不同的语法重写一个简单的内部联接。一旦取消对列的调用,完整的联接条件就变成了ca.id\u type=f.id\u type和ca.id\u value=f.id\u value上的
。那是重写。请注意,通过提供示例数据和预期结果,您可以更快地解决问题。此处不涉及数据透视,只需使用不同的语法重写简单的内部联接。一旦取消拆分列,完整的联接条件将变为ca.id_type=f.id_type和ca.id_value=f.id_value
。那是重写。请注意,通过提供样本数据和预期结果,您可以更快地解决问题。