Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将列名与其他表中的数据匹配_Sql_Sql Server - Fatal编程技术网

Sql 将列名与其他表中的数据匹配

Sql 将列名与其他表中的数据匹配,sql,sql-server,Sql,Sql Server,我已经动态创建了一个临时表#temp1,它根据json字符串动态创建列。该表如下所示 #temp1 身份证件 领域 果 蔬菜 1. 字段1 A. B 2. 字段2 C D 您需要使用动态查询,因为您的列是动态的 declare @sql nvarchar(max), @case_stmt nvarchar(max) -- form the case statement select @case_stmt = STRING_AGG ('WHEN ''' + type

我已经动态创建了一个临时表#temp1,它根据json字符串动态创建列。该表如下所示

#temp1

身份证件 领域 果 蔬菜 1. 字段1 A. B 2. 字段2 C D
您需要使用
动态查询
,因为您的列是动态的

declare @sql       nvarchar(max),
        @case_stmt nvarchar(max)

-- form the case statement
select @case_stmt = STRING_AGG ('WHEN ''' + type + ''' THEN t1.' + quotename(t.type), char(13))
from   typ t
where  exists 
       (
           select *
           from   result r 
           where  t.type_id = r.type_id
       )

-- Print out for insepction
print @case_stmt

-- form final query
select @sql = 'update r' + char(13)
            + 'set value = CASE t.type' + char(13)
            + @case_stmt + char(13)
            + 'END'+ char(13)
            + 'from   result r' + char(13)
            + 'inner join #temp1 t1 on r.Field = t1.Field' + char(13)
            + 'inner join typ t     on r.type_id = t.type_id' + char(13)
-- Print out for insepction
print @sql            

exec (@sql);

select *
from  result
注:
char(13)
是新行。它有助于对查询进行简单的格式化


如果结果表确实已经有一条已经包含字段和类型id的现有记录,如您所述,那么我认为您可以尝试以下方法:

UPDATE B
SET B.value = 
    CASE WHEN
        D.type = ‘FRUIT’
    THEN
        T.FRUIT
    WHEN
        D.type = ‘VEGE’
    THEN T.VEGE
    END
FROM result_table B
INNER JOIN #temp1 T ON T.field = B.field
INNER JOIN type_table D on D.type_id = B.type_id

但是,这将要求您对希望在将来更新的每种类型的id都有一个额外的CASE语句

如果您有可能更改临时表创建和填充JSON对象的方式,那么请考虑构造这样的临时表,而不是:

身份证件 领域 类型 价值 1. 字段1 果 A. 2. 字段1 蔬菜 B 3. 字段2 果 C 4. 字段2 蔬菜 D
请包括您的查询尝试。以及获得所需结果所需的逻辑。由于表类型通常较大,是否有任何替代方案不在用例中使用??可能只是将列名和类型
JOIN
typ
之间的匹配值返回到
@case\u stmt
表,或者使用
EXISTS()
我想你的答案是我所期望的,但我有一个错误:无法解决“Latin1\u General\u CI\u AI”和“Latin1_General_CI_AS”在等于操作中。您还可以显示@case_stmt或use EXISTS()的连接类型到结果表的查询吗?添加了
JOIN
@case_stmt