【问题标题】:insert value from join with If/Case from two tables, into a third table将来自两个表的 If/Case 连接的值插入到第三个表中
【发布时间】:2021-08-11 00:10:33
【问题描述】:

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

一个链接服务器,所以我使用的是开放式查询。 (编辑更新:SQL Server) 两张表如下图:

我需要将值插入到第三张表中,插入到第三张表中的值来自上面我通过 KEY ID 连接的两个表。

但是,在连接中,我想选择表 A 中的所有列,并且只选择表 B 中的值代码(表 B 中每个键 ID 有多个值代码),因此需要一个 if 或 case取决于以下几点:

如果/案例 表 B 有 Code = PRODUCT,选择 VALUE CODE A,

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

如果给定的 Key ID 没有 Code = PRODUCT 或 Code = FOO,则选择对应于 Code = BAR 的 VALUE CODE,在这种情况下 Key ID 3 为 VALUE CODE F。

更新: 有时 Foo 可以在表 B 中的 Product 之前出现,如果没有对应关系,说没有 product、foo 或 bar 我希望在列行中返回空白。

如何以正确的方式编写这个使用 if/case 进行连接的 sql 查询?

【问题讨论】:

  • 您使用的是什么 SQL 平台?
  • 编辑您的问题并显示您想要的结果。

标签: sql if-statement join case openquery


【解决方案1】:

不确定您使用的是什么平台,但这是我在 SQL Server 中的操作方式

SQL Server 方法

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

【讨论】:

  • 谢谢,完美。最后一个问题,例如说没有“Bar”作为 tb.Code,那么我想将 ValueCode 返回为空白,我该怎么做?
  • 澄清,如果Code表B中没有Product、Foo或Bar,那么我想返回Value Code空白/NULL
  • 只需将Cross Apply改为Outer Apply即可。交叉应用就像一个内部连接(需要在两个结果中匹配),而外部应用就像一个左连接。答案已相应编辑
  • 尝试添加我添加的行And tb.Code In ('Product','Foo','Bar')
  • 成功了!你是我的英雄!谢谢
【解决方案2】:

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

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 子句。

【讨论】:

  • 这似乎是为了oracle?就我而言,它是 sql(是的,最初没有提到 :))
  • @Johan。 . .这是标准 SQL,因为您没有指定数据库。您还没有指定数据库,应该将其作为标签添加到问题中。答案包括fetch first 的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多