SQL查询到SELECT并仅替换一个列值而不定义其他列

时间:2017-12-20 18:04:59

标签: sql sql-server

我需要选择,但我需要替换一列的值。该表有25列,我希望通过列出所有列来使其可读,以从另一个表中替换一列。以下是我所做的工作,

SELECT *  
INTO #temp_grouping
FROM [ae_p_phs_e]
WHERE [template_id] = '1010'
    AND [status_code] = 'OPEN'
    AND [shop] = 'SP-STEAM'

-- select row from the temp table for inserting
UPDATE #temp_grouping
SET 
    [description] = [source_data].[description]
FROM 
    [ae_a_asset_e] AS [source_data]
WHERE 
    [source_data].[asset_tag] = [#temp_grouping].[asset_tag]
    AND [source_data].[multitenant_id] = [#temp_grouping].[multitenant_id]

SELECT *
FROM #temp_grouping

--drop the temp table
DROP TABLE #temp_grouping

但是有什么其他方法可以做同样的事情?

样品

TABLE A
-------------------------------------------------
|col1  | col2  | description  | .... | nthColumn|
-------------------------------------------------


TABLE B
-------------------------------------------------
|col1  | col2  | description  | .... | nthColumn|
-------------------------------------------------

示例数据返回第一个表A

1,2017-026221,001,BAD description,..... VERY LAST
1,2017-026221,002,BAD description,..... VERY LAST
1,2017-026221,003,BAD description,..... VERY LAST
1,2017-026221,004,BAD description,..... VERY LAST
1,2017-026221,005,BAD description,..... VERY LAST

示例数据返回第一个表B

1,null,XX1,GOOD description,..... VERY LAST
1,null,XX2,GOOD description,..... VERY LAST
1,null,XX3,GOOD description,..... VERY LAST
1,null,XX4,GOOD description,..... VERY LAST
1,null,XX5,GOOD description,..... VERY LAST

示例返回数据返回,基本上首先是表A,其中一个值在表B上

1,2017-026221,001,GOOD description,..... VERY LAST
1,2017-026221,002,GOOD description,..... VERY LAST
1,2017-026221,003,GOOD description,..... VERY LAST
1,2017-026221,004,GOOD description,..... VERY LAST
1,2017-026221,005,GOOD description,..... VERY LAST

假设

  • Script Table As是自动填充列的解决方案,但不适合需要。解决方案 问题不应该包括与问题相反的问题 不列出标题中所述的列。
  • 在许多情况下,不允许使用允许您读取系统表的GRANTS的解决方案。

到目前为止的解决方案

开始听起来像答案是可能没有其他方法来做我所做的所有列出所有列。如果事实并非如此,那么我将删除此部分。

2 个答案:

答案 0 :(得分:0)

这是使用动态查询执行它的唯一方法。

declare @query nvarchar(max) = ''
declare @temp_grouping nvarchar(max) = 'col1, col2, col3'
set @query = 'SELECT  '+@temp_grouping+' FROM [ae_p_phs_e] where [template_id] = ''1010'''
print @query
exec sp_executesql @query

答案 1 :(得分:0)

我担心你的评论并没有真正澄清我想要弄清楚的内容,但让我继续根据我猜你想要做的事情提出一个解决方案。实际上,基于两个猜测,我有两个解决方案:

  1. 您希望从包含大量列的表中编写SELECT,因此您希望避免输入所有列名称,除了它会进行大量输入之外没有其他原因。但是你不能做一个简单的SELECT *,因为你想在输出中用一个来自另一个表的列替换一列。
  2. 解决方案:右键单击SSMS Object Explorer窗格中的表,然后选择Script Table As>选择到>新查询窗口。

    您将获得一个新的查询窗口,其中写出了SELECT查询,并为您写出了所有列名。无需打字。然后只需使用所需的JOIN修改该查询,并在SELECT列表中找到要替换的列,并将其替换为JOINed表中的列。这会在特定的基础上生成所需的SELECT查询。

    1. 你有一个更流畅的情况,你不一定知道,无论出于什么原因,列将是什么,所以你不能硬编码列列表,但你知道如果某列看来,你想用另一个替换它。
    2. 解决方案:使用动态SQL查询,就像Rainman的回答一样。您可以通过查询系统表来动态生成该列表,以获取属于您感兴趣的表的所有列,而不是键入列列表(如您在评论中提到的那样)。