将来自两个 table 的 If/Case 连接的值插入第三个 table

insert value from join with If/Case from two tables, into a third table

所以我在创建 sql 查询时遇到以下问题。

链接服务器正在使用开放式查询。 (编辑更新:SQL 服务器) 两个 table 如下图所示:

我需要将值插入第三个 table,插入第三个 table 的值来自我通过 KEY ID 在其上方加入的两个 table。

但是,在联接中我想选择 table A 中的所有列,并且只选择 table B 中的值代码([中的每个密钥 ID 有多个值代码=43=] B) 因此需要一个 if 或 case 取决于以下内容:

If/Case Table B 的代码 = PRODUCT,选择 VALUE CODE A,

如果没有 Code=PRODUCT,则从 code = FOO 中选择 VALUE CODE,如果 KEY ID 2,则为 VALUE CODE D。

如果给定密钥 ID 没有代码 = PRODUCT 或没有代码 = FOO,则选择对应于代码 = BAR 的值代码,在这种情况下,密钥 ID 3 将为值代码 F。

更新: 有时 Foo 可以在 table B 中出现在 Product 之前,如果没有对应关系,则说既没有产品,也没有 foo 或 bar 我希望 return 在列行中留空。

如何以正确的方式编写与 if/case 连接的 sql 查询?

不确定您使用的是什么平台,但这是我在 SQL Server

中的做法

SQL 服务器方法

Select a.KeyID,a.[TimeStamp],a.SalesAmount,b.ValueCode
From TableA As a
Outer Apply (
            /*This will grab the top 1 KeyID match, with the sorting you specified based on the code in TableB*/
            Select Top (1) *
            From TableB As tb
            Where a.KeyId = tb.KeyID
            And tb.Code In ('Product','Foo','Bar') /*If only want codes matching the 3 values, then include this line*/
            Order By 
                Case 
                    When tb.Code = 'Product' Then 1
                    When tb.Code = 'Foo' Then 2
                    When tb.Code = 'Bar' Then 3
                    Else 4 /*Pick any other values last*/
                End
        ) As b

在任何数据库中,您都可以使用相关子查询:

select a.*,
       (select b.valuecode
        from b
        where b.keyid = a.keyid and
              b.code in ('Product', 'Foo', 'Bar')
        order by (case code when 'Product' then 1 when 'Foo' then 2 else 3 end)
        fetch first 1 row only
       ) as valuecode
from a;

您还没有指定正在使用的数据库。并非所有数据库都支持标准 fetch first 语法。有些使用 limitselect top 或其他一些方法。

我也不确定是否需要子查询中的 where 子句。