【问题标题】:Create additional rows in select statement result in SQL Server在 SQL Server 中的 select 语句结果中创建附加行
【发布时间】:2020-01-31 20:37:13
【问题描述】:

我正在创建一个相当复杂的 SELECT 查询,其中包含跨多个表和视图的连接。主表与多个辅助表连接。行的结果集需要根据大约 25 个 CASE 语句条件进一步拆分,用于两种场景:

  1. 检查一列的特定值,根据该特定值,必须为几列创建具有一些唯一值的新行;
  2. 必须检查使用 AND 条件的两列才能创建新行

这是一个例子:

SELECT col1, col2, col3, col25, col26, col27, col48
FROM T1
INNER JOIN Table2 on Table2.col1 = T1.col1
INNER JOIN Table3 on Table3.col2 = T1.col1 

Col25 正在与来自 INNER JOIN 的列 (Table2.ColA) 进行比较,这是需要我的 CASE 条件的地方,其中大约有 25 个:

CASE WHEN Table2.ColA = 'W-%' THEN Col25 = 'WATER'

我还需要在

处插入一个或多个额外的行
Col25 = 'REL', 
Col26 = 5000,
Col27 = 'M'

基本上,CASE 表达式应该做的是从我的 SELECT 语句中替换结果行的值,并插入一个或多个具有不同 Col25、Col26、Col27 值的行,同时保持其他列值与那些相同由 SELECT 语句返回。

我知道这可能不仅仅涉及我的选择语句,并且可能需要遍历包含我的主要查询结果的游标以创建新闻行。这是我唯一可用的路线吗?任何帮助或指示将不胜感激。

【问题讨论】:

  • 如果您以一些示例数据的形式提供问题的简化版本,将会有所帮助。示例数据为建表和值插入 sql 语句。
  • 让帮助您成为可能:minimal reproducible example.
  • 不清楚你在问什么: 1. “一些列的一些唯一值”是什么意思?也许是一些例子。 2.你的意思是2列必须有特定的值才能触发条件? .光标通常是最后的选择,并且只应在所有其他选项都更糟时使用。您需要向我们提供一些您想要实现的原型/示例。
  • 我添加了一个代码示例。不确定这是否足够。
  • 只是把case语句放在你的select子句中?我很困惑什么不起作用,你试图做什么,以及你想要完成什么。 SELECT Col24, CASE WHEN Table2.ColA = 'W-%' THEN 'WATER' as Col25 , 5000 as Col26, 'M' as Col27, Table3.col29 ... whatever you want

标签: sql sql-server case rows


【解决方案1】:

选项 1

with q as ( -- your query
    select ...
)
select * from q
union all
select ... from q
where <conditions requiring a copy>

选项 2

inner join (values ('org'), ('new')) copy(flag) on flag = 'org' or
    flag = 'new' and 1 = case
        when col25 = 'A' then 1
        when col25 = 'B' and col26 = 'X' then 1
        ...
    end

对于输出列,您需要类似的cases 来区分原始行和新行。

【讨论】:

  • 我要试试第一种方法。如果我有几行要复制,我是否需要多个“联合所有”语句和查询?
  • 如果您需要多个副本,则需要多个联合。但是对于复制不同的行,没有。
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多