【发布时间】:2021-03-29 20:38:06
【问题描述】:
如何在 SQL Server 中跳过唯一约束错误?
这是我的源表:
CREATE TABLE source
(
RollNo INTEGER,
Nam VARCHAR(6),
Gender VARCHAR(1),
Score INTEGER
);
INSERT INTO source (RollNo, Nam, Gender, Score)
VALUES ('101', 'John', 'M', '85'),
('102', 'Tracy', 'F', '79'),
('103', 'Jake', 'M', '92'),
('104', 'Edgar', 'M', NULL),
('105', 'Monica', 'F', '25'),
('106', 'Monica', 'F', '50'),
('1070', 'Yash', 'M', '68'),
('107', 'Yash', 'M', '70'),
('108', 'SFS', 'M', '68'),
('18', 'SFS77', 'F', '65');
我想从source 表中填充dest 表,其中name 和Gender 是唯一键,SeqNo 应该自动递增:
dest表说明:
CREATE TABLE dest
(
SeqNo BIGINT IDENTITY(1000,1) PRIMARY KEY,
RollNo INTEGER,
Nam VARCHAR(6),
Gender VARCHAR(1),
Score INTEGER
);
这是我尝试过的:
尝试 #1:
INSERT INTO dest (RollNo, Nam, Gender, Score)
SELECT
FIRST_VALUE(RollNo) OVER (PARTITION BY Nam, Gender ORDER BY Score DESC),
FIRST_VALUE(Nam) OVER (PARTITION BY Nam, Gender ORDER BY Score DESC),
FIRST_VALUE(Gender) OVER (PARTITION BY Nam, Gender ORDER BY Score DESC),
FIRST_VALUE(Score) OVER (PARTITION BY Nam, Gender ORDER BY Score DESC)
FROM
source
WHERE
Nam IS NOT NULL AND Gender IS NOT NULL ;
错误:违反 UNIQUE KEY 约束
尝试 #2:
INSERT INTO dest (RollNo, Nam, Gender, Score)
SELECT MAX(RollNo),Nam, Gender, MAX(Score)
FROM source
GROUP BY Nam, Gender
ORDER BY MAX(Score) DESC;
输出:
| SeqNo | RollNo | Nam | Gender | Score |
|-------|--------|--------|--------|--------|
| 1000 | 103 | Jake | M | 92 |
| 1001 | 101 | John | M | 85 |
| 1002 | 102 | Tracy | F | 79 |
| 1003 | 1070 | Yash | M | 70 |
| 1004 | 108 | SFS | M | 68 |
| 1005 | 18 | SFS77 | F | 65 |
| 1006 | 106 | Monica | F | 50 |
| 1007 | 104 | Edgar | M | (null) |
如果您看到 yash 行,它占用了最大的 RollNo。和最大的分数是错误的,我希望它取第一个值,但我不知道该怎么做。
排除以上两种方法,有没有其他方法可以解决?
【问题讨论】:
-
几天前你还在使用 MySQL。您真的确定您使用的是 SQL Server 吗?它们有不同的语法规则。
标签: sql sql-server sql-insert greatest-n-per-group