SQL SERVER更新或在左联接后插入

问题描述 投票:0回答:1

我有一个表Animals

Id | Name     | Count | -- (other columns not relevant)
1  | horse    | 11   
2  | giraffe  | 20

我想尝试从CSV字符串插入或更新值

是否有可能在1个查询中执行以下操作?

;with results as
(
 select * from
 (
  values ('horse'), ('giraffe'), ('lion')
 )
  animal_csv(aName)
  left join animals on
  animals.[Name] = animal_csv.aName
)
update results 
set
[Count] = 1 + animals.[Count]
-- various other columns are set here
where Id is not null

--else
--insert into results ([Name], [Count]) values (results.aName, 1) 
-- (essentially Where id is null)
sql-server tsql sql-update left-join insert-update
1个回答
1
投票

看起来您正在寻找的是表变量或临时表,而不是公用表表达式。

[如果我正确理解了您的问题,则您将根据从CSV获取的数据来构建结果集,并通过递增值将其合并,然后返回该结果集。

当我阅读您的代码时,看起来您的结果看起来像这样:

aName    | Id | Name    | Count
horse    | 1  | horse   | 12
giraffe  | 2  | giraffe | 21
lion     |    |         |

我认为您在最终结果集中寻找的是这个:

Name     | Count
horse    | 12
giraffe  | 21
lion     | 1

首先,您可以在单个CTE语句中从csv和表获取结果集:

;WITH animal_csv AS (SELECT * FROM (VALUES('horse'),('giraffe'), ('lion')) a(aName))
SELECT ISNULL(Name, aName) Name
,   CASE WHEN [Count] IS NULL THEN 1 ELSE 1 + [Count] END [Count] 
    FROM animal_csv
        LEFT JOIN animals
            ON Name = animal_csv.aName

或者,如果要使用表变量构建结果集:

DECLARE @Results TABLE
(
  Name  VARCHAR(30)
, Count INT
)

;WITH animal_csv AS (SELECT * FROM (VALUES('horse'),('giraffe'), ('lion')) a(aName))
INSERT @Results
SELECT ISNULL(Name, aName) Name
,   CASE WHEN [Count] IS NULL THEN 1 ELSE 1 + [Count] END [Count] 
    FROM animal_csv
        LEFT JOIN animals
            ON Name = animal_csv.aName

SELECT * FROM @results

或者,如果您只想使用临时表,则可以这样构建它(在释放/关闭连接或显式删除连接时删除临时表):

;WITH animal_csv AS (SELECT * FROM (VALUES('horse'),('giraffe'), ('lion')) a(aName))
SELECT ISNULL(Name, aName) Name
,   CASE WHEN [Count] IS NULL THEN 1 ELSE 1 + [Count] END [Count] 
    INTO #results
    FROM animal_csv
        LEFT JOIN animals
            ON Name = animal_csv.aName

SELECT * FROM #results
© www.soinside.com 2019 - 2024. All rights reserved.