Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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_Database_Tsql_Join - Fatal编程技术网

Sql 基于优先级表消除重复记录

Sql 基于优先级表消除重复记录,sql,sql-server,database,tsql,join,Sql,Sql Server,Database,Tsql,Join,我有2个表,1个产品有以下数据 orderName Skey 3.0 100 Pen 100 Scale 101 Pen 101 Bottle 102 orderName Priority Scale 1 Pen 2 Bottle 3 3.0 4 优先级表2有以下数据 ord

我有2个表,1个产品有以下数据

orderName       Skey
3.0             100
Pen             100
Scale           101
Pen             101
Bottle          102
orderName       Priority
Scale           1
Pen             2
Bottle          3
3.0             4
优先级表2有以下数据

orderName       Skey
3.0             100
Pen             100
Scale           101
Pen             101
Bottle          102
orderName       Priority
Scale           1
Pen             2
Bottle          3
3.0             4
我想根据优先级表中的订单优先级从产品表中删除重复的ValuesKey

输出是应该给出的

orderName   Skey
Pen         100
Scale       101
Bottle      102
我不确定如何使用单个查询来实现这一点。
请帮助

以下是一个完整的工作示例:

DECLARE @Products TABLE
(
    [orderName] VARCHAR(24)
   ,[Skey] INT
);

DECLARE @priority TABLE
(
    [orderName] VARCHAR(25)
   ,[Priority] TINYINT
);

INSERT INTO @Products ([orderName], [Skey])
VALUES ('3.0', 100)
      ,('Pen', 100)
      ,('Scale', 101)
      ,('Pen', 101)
      ,('Bottle', 102);

INSERT INTO @priority ([orderName], [Priority])
VALUES ('Scale', 1)
      ,('Pen', 2)
      ,('Bottle', 3)
      ,('3.0', 4);


SELECT TOP 1 WITH TIES P.[orderName], P.[Skey]
FROM @Products P
INNER JOIN @priority PR
    ON P.[orderName] = PR.[orderName]
ORDER BY ROW_NUMBER() OVER (PARTITION BY P.[Skey] ORDER BY PR.[Priority]);
cte作为精选产品。*, 按Skey划分的行数 按优先级排序 优先权 其中Product.orderName=priority.orderName-rn 从产品 删去 来自cte 其中rn>1;
优先级表中的PS.orderName列必须定义为唯一。优先级列也需要唯一性。

使用按键分区1按键排序2以按分区排序数据。然后从每个分区中选择第一项。代码来了

create table Product(orderName varchar(100),Skey int);
insert into Product values('3.0',100);
insert into Product values('Pen',100);
insert into Product values('Scale',101);
insert into Product values('Pen',101);
insert into Product values('Bottle',102);

create table Priority(orderName  varchar(100),Priority int);
insert into Priority values('Scale',1);
insert into Priority values('Pen',2);
insert into Priority values('Bottle',3);
insert into Priority values('3.0',4);

select orderName,skey FROM
(
    select p.orderName,skey,pr.Priority,row_number() over(partition by skey order by pr.Priority) as rowNum 
    from Product p join Priority pr on p.orderName=pr.orderName 
) t where t.rowNum = 1

OP需要删除重复值,而不是选择。