Sql 从另一个表插入数据时按多列分区
如何跳过SQL Server中的唯一约束错误 这是我的源表: 创建表源 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 插入源RollNo、Nam、性别、分数 值“101”、“John”、“M”、“85”, “102”,“特雷西”,“F”,“79”, “103”,“杰克”,“M”,“92”, “104”,“埃德加”,“M”,空, “105”,“莫妮卡”,“F”,“25”, “106”,“Monica”,“F”,“50”, ‘1070’、‘Yash’、‘M’、‘68’, ‘107’、‘Yash’、‘M’、‘70’, ‘108’、‘SFS’、‘M’、‘68’, ‘18’、‘SFS77’、‘F’、‘65’; 我希望从源表填充dest表,其中name&Gender是唯一键,SeqNo应自动递增: dest表说明: 创建表dest SeqNo BIGINT IDENTITY1000,1主键, 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 以下是我尝试过的: 尝试1: 插入dest RollNo、Nam、性别、分数 选择 第一个值不按Nam划分,按分数描述的性别顺序, 根据Nam划分的第一个值Nam,根据分数描述的性别顺序, 第一_值Nam划分的性别,分数描述的性别顺序, 按Nam划分的第一个值得分,按得分描述的性别顺序 从…起 来源 哪里 Nam不为空,性别不为空; 错误:违反唯一密钥约束 尝试2: 插入dest RollNo、Nam、性别、分数 选择MAXRollNo、Nam、性别、MAXScore 来源 不结盟运动分组,性别 按MAXScore DESC排序; 输出:Sql 从另一个表插入数据时按多列分区,sql,sql-server,sql-insert,greatest-n-per-group,Sql,Sql Server,Sql Insert,Greatest N Per Group,如何跳过SQL Server中的唯一约束错误 这是我的源表: 创建表源 没有整数, Nam VARCHAR6, 性别问题1, 分数整数 ; 插入源RollNo、Nam、性别、分数 值“101”、“John”、“M”、“85”, “102”,“特雷西”,“F”,“79”, “103”,“杰克”,“M”,“92”, “104”,“埃德加”,“M”,空, “105”,“莫妮卡”,“F”,“25”, “106”,“Monica”,“F”,“50”, ‘1070’、‘Yash’、‘M’、‘68’, ‘10
| 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) |
如果你看到亚什的那一排,那就是罗尔诺的马克斯。最大分数是错误的,我希望它取第一个值,但我不知道怎么做
是否有其他方法可以排除上述两种方法?您可以识别具有行号的每个Nam/SEXT元组得分最高的行,并使用该信息过滤源数据:
INSERT INTO dest (RollNo, Nam, Gender, Score)
SELECT RollNo, Nam, Gender, Score
FROM (
SELECT s.*,
ROW_NUMBER() OVER(PARTITION BY Nam, Gender ORDER BY Score DESC) rn
FROM source s
) s
WHERE rn = 1
旁注:我建议对目标表中的Nam/SEXT元组设置一个唯一约束,以便在插入时始终拒绝潜在的重复项:
CREATE TABLE dest (
SeqNo BIGINT IDENTITY(1000,1) PRIMARY KEY,
RollNo INTEGER,
Name VARCHAR(6),
Gender VARCHAR(1),
Score INTEGER,
UNIQUE (Name, Gender)
);
旁注2:不要在列名周围加单引号;它们代表标准SQL中的文字字符串。您可以识别具有行号的每个Nam/SEXT元组得分最高的行,并使用该信息过滤源数据:
INSERT INTO dest (RollNo, Nam, Gender, Score)
SELECT RollNo, Nam, Gender, Score
FROM (
SELECT s.*,
ROW_NUMBER() OVER(PARTITION BY Nam, Gender ORDER BY Score DESC) rn
FROM source s
) s
WHERE rn = 1
旁注:我建议对目标表中的Nam/SEXT元组设置一个唯一约束,以便在插入时始终拒绝潜在的重复项:
CREATE TABLE dest (
SeqNo BIGINT IDENTITY(1000,1) PRIMARY KEY,
RollNo INTEGER,
Name VARCHAR(6),
Gender VARCHAR(1),
Score INTEGER,
UNIQUE (Name, Gender)
);
旁注2:不要在列名周围加单引号;它们代表标准SQL中的文字字符串。感谢您的帮助。实际上,我是SQL方面的新手。它按预期工作,但我必须删除s.*。你能解释一下为什么吗@HarshitMahajan:缺少表别名。修好了。谢谢你的帮助。实际上,我是SQL方面的新手。它按预期工作,但我必须删除s.*。你能解释一下为什么吗@HarshitMahajan:缺少表别名。已修复。几天前您正在使用MySQL。您真的确定您正在使用SQL Server吗?这些都有不同的语法规则。几天前你在使用MySQL。您真的确定您正在使用SQL Server吗?它们有不同的语法规则。