将来自两个 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
语法。有些使用 limit
或 select top
或其他一些方法。
我也不确定是否需要子查询中的 where
子句。
所以我在创建 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
语法。有些使用 limit
或 select top
或其他一些方法。
我也不确定是否需要子查询中的 where
子句。