【问题标题】:How to write SQL script to update conditional data and constraints?如何编写 SQL 脚本来更新条件数据和约束?
【发布时间】:2018-02-27 10:44:45
【问题描述】:

我刚刚接触过 SQL,但还没有解决方案。 我有 2 个表 A 和 B:

A                B 
ID (char)        Year (char)
Zone (char)      Code (char)
ZCode (char)     

首先,表 B 将是完全空的。表A的Ex数据:

A                
01  A  2013/AA   
02  A  2018/KK
03  A  null
04  B  
05  B  2016/HH

我想将表 A 中的数据更新到表 B,前提是只有 Zone 的 ZCode 具有最新年份,并且 ZCode 将用“/”分隔。这是我想要的结果:

B
2018  KK
2016  HH

期待有人为我提供解决方案。

【问题讨论】:

  • 指定的B表数据是在操作之前还是之后?我们想要两个版本。
  • 一开始,B表会是完全空的
  • 如果你的数据是一致的,为什么你不能使用left-4right-2
  • 对不起,你能解释一下吗?

标签: sql sql-server syntax sql-update


【解决方案1】:

如果您的数据一致,这是一个非常简单的解决方案。这仅适用于您的数据始终具有完整的年份,例如左侧的数字 ex:2018,右侧只有 2 个字符。这更多的是列长度的硬编码,看不出你不能使用它的原因。 使用Max 将通过代码选择最近一年

Insert into tableB (Year,Code)
select Max(Left(Columnname,4)) year, 
       Right (columnname,2) Code  from TableA
       where Right (columnname,2) is not null or Right (columnname,2)<> ''
       group by Right (columnname,2)

【讨论】:

  • 表 A 中还有 1 个请求,即:当 ZCode 不为空且 Zone 的 ZCode 为最新年份时才更新
  • 稍作改动 Right (columnname,2)&lt;&gt; '' 而不是 =
  • @TrietPham 如果它解决了您的问题,请接受答案
【解决方案2】:

试试这个

IF OBJECT_ID('dbo.TableA')IS NOT NULL
  DROP TABLE TableA
IF OBJECT_ID('dbo.TableB')IS NOT NULL
  DROP TABLE TableB
CREATE TABLE TableA (Id INT,Zone VARCHAR(2) ,ZCode VARCHAR(20))
CREATE TABLE TableB ([Year] INT,Code VARCHAR(20))   
GO

INSERT INTO TableA(Id,Zone,ZCode)
SELECT 01,'A','2013/AA' UNION ALL   
SELECT 02,'B','2016/HH' UNION ALL
SELECT 03,'A','2018/KK' 
GO


INSERT INTO TableB

SELECT   [Year]
        ,[Code] 
FROM
(
    SELECT   SUBSTRING(ZCode,0,CHARINDEX('/',ZCode)) As [Year]
            ,SUBSTRING(ZCode,CHARINDEX('/',ZCode)+1,LEN(ZCode)) AS Code 
    FROM TableA
)dt


SELECT * FROM TableB  ORDER BY [Year] DESC

结果

Year    Code
------------
2018    KK
2016    HH
2013    AA

【讨论】:

  • 表 A 中还有 1 个请求,即:当 ZCode 不为空且 Zone 的 ZCode 为最新年份时才更新
【解决方案3】:

为了在 tableB 中 UPDATE,您需要 JOINYear / Code 列上使用 tableB 的表

WITH CTE AS
(
     SELECT 
          left(a.zcode, 4) year, 
          substring(a.zcode, charindex('/', a.zcode)+1, len(a.zcode)) code  
     FROM tableA a
     INNER JOIN (
              select Zone, max(left(zcode, 4)) year 
              FROM tableA
              GROUP BY Zone
      )b ON a.Zone = b.zone and b.year = left(a.zcode, 4)
)
SELECT * FROM CTE

【讨论】:

  • 表 A 中还有 1 个请求,即:当 ZCode 不为空且 Zone 的 ZCode 为最新年份时才更新
【解决方案4】:

下面的代码 sn-p 将给出您想要的输出,现在根据您的要求,您可以在 tableB 中执行 INSERT 或执行 UPDATE

DECLARE @A TABLE(ID CHAR(10), ZONE CHAR(10), ZCODE CHAR(20))
INSERT INTO @A VALUES
('01',  'A',  '2013/AA'),   
('02',  'B',  '2016/HH'),
('03',  'A',  '2018/KK')

SELECT Year,Code FROM(
SELECT Year,Code,ROW_NUMBER() OVER (PARTITION BY ZONE ORDER BY Year DESC) rn FROM
(SELECT cast(concat('<x>', REPLACE(ZCODE, '/', '</x><x>'), '</x>') as xml).value('/x[1]','varchar(100)') AS Year,
       cast(concat('<x>', REPLACE(ZCODE, '/', '</x><x>'), '</x>') as xml).value('/x[2]','varchar(100)') AS Code,*
FROM @A WHERE ZCODE IS NOT NULL) t1) t2
WHERE rn = 1;

【讨论】:

  • 表 A 中还有 1 个请求,即:当 ZCode 不为空且 Zone 的 ZCode 为最新年份时才更新
  • 最新年份条件将被处理,因为查询使用ROW_NUMBER() 对数据进行分区并从中获取最新年份。更新后的查询也将处理 ZCode 空能力。
【解决方案5】:

当表 B 完全为空时,您可以使用此查询将数据插入到表 B 中

INSERT INTO B ([YEAR], [MONTH])
select
Substring(ZCode,0,charindex('/',ZCode)) BYEAR,
Substring(ZCode,charindex('/',ZCode)+1,LEN(ZCode)-charindex('/',ZCode)) BCode
from A

其他用户可以根据 BCode 更新此查询以更新表 B 的记录。

为 NOT NULL 和 GROUP 条件编辑查询

select MAX(v.BYEAR), v.BCode from
(select
 Substring(ZCode,0,charindex('/',ZCode)) BYEAR
,Substring(ZCode,charindex('/',ZCode)+1,LEN(ZCode)-charindex('/',ZCode)) BCode
from B ) v
Where v.BCODE IS NOT NULL 
Group by v.BCODE

【讨论】:

  • 表 A 中还有 1 个请求,即:当 ZCode 不为空且 Zone 的 ZCode 为最新年份时才更新
  • 您可以在 BCode 字段中添加分组条件以获取最新年份。
  • select MAX(v.BYEAR), v.BCode from (select Substring(ZCode,0,charindex('/',ZCode)) BYEAR ,Substring(ZCode,charindex('/',ZCode )+1,LEN(ZCode)-charindex('/',ZCode)) BCode from B ) v where v.BCODE IS NOT NULL 按 v.BCODE 分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多