Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Sql Server 2008 - Fatal编程技术网

删除SQL中一对元素的顶行

删除SQL中一对元素的顶行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在数据库中有一个表,它将两个对象id(a,B)配对,每对对象都有一个标志(标志1) ObjectA和ObjectB对是主键 表示例: Object_A | Object_B | Flag_1 809790 809144 1 814231 809144 1 809790 510127 1 809022 809144 1 809790 803745 1 80125

我在数据库中有一个表,它将两个对象
id(a,B)
配对,每对对象都有一个标志
(标志1)

ObjectA和ObjectB对是主键

表示例:

Object_A | Object_B | Flag_1 809790 809144 1 814231 809144 1 809790 510127 1 809022 809144 1 809790 803745 1 801250 782873 1 809022 623154 1 809022 911310 1 809022 573158 1 909022 573158 1 示例表中的结果:

Object_A 809790 809022 Object_A | Object_B | Flag_1 809790 809144 1 809790 803745 1 809790 510127 1 809022 911310 1 809022 809144 1 809022 623154 1 809022 573158 1 Object_A | Object_B | Flag_1 809790 809144 1 809790 803745 1 809790 510127 0 809022 911310 1 809022 809144 1 809022 623154 0 809022 573158 0 示例表中的结果:

Object_A 809790 809022 Object_A | Object_B | Flag_1 809790 809144 1 809790 803745 1 809790 510127 1 809022 911310 1 809022 809144 1 809022 623154 1 809022 573158 1 Object_A | Object_B | Flag_1 809790 809144 1 809790 803745 1 809790 510127 0 809022 911310 1 809022 809144 1 809022 623154 0 809022 573158 0 这有点复杂,所以我希望我对这个问题解释得足够好。我可能会放弃,在
C#
中以编程方式完成它,但我仍然想知道是否可以直接在SQL server中完成。也许创建临时表?不知道。

你可以用这个:

update t1
set t1.Flag_1 = 0
from table1 t1
inner join 
      (select t2.Object_A, t2.Object_B, 
             ROW_NUMBER() OVER(PARTITION BY Object_A ORDER BY Object_A, Object_B DESC) AS RowNo
       from table1 t2             
                ) t2 on t1.Object_B = t2.Object_B and t1.Object_A = t2.Object_A
where t2.RowNo > 2
MS SQL Server 2012架构设置

CREATE TABLE Table1
    ([Object_A] int, [Object_B] int, [Flag_1] int)
;

INSERT INTO Table1
    ([Object_A], [Object_B], [Flag_1])
VALUES
    (809790, 809144, 1),
    (814231, 809144, 1),
    (809790, 510127, 1),
    (809022, 809144, 1),
    (809790, 803745, 1),
    (801250, 782873, 1),
    (809022, 623154, 1),
    (809022, 911310, 1),
    (809022, 573158, 1)
;
update t1
set t1.Flag_1 = 0
from table1 t1
inner join (SELECT t2.Object_A, t2.Object_B, ROW_NUMBER() OVER(PARTITION BY Object_A ORDER BY Object_A, Object_B DESC) AS RowNo
              FROM table1 t2              
            ) t2 on t1.Object_B = t2.Object_B and t1.Object_A = t2.Object_A
where t2.RowNo > 2

select * 
from table1
order by 1,2
| OBJECT_A | OBJECT_B | FLAG_1 |
|----------|----------|--------|
|   801250 |   782873 |      1 |
|   809022 |   573158 |      0 |
|   809022 |   623154 |      0 |
|   809022 |   809144 |      1 |
|   809022 |   911310 |      1 |
|   809790 |   510127 |      0 |
|   809790 |   803745 |      1 |
|   809790 |   809144 |      1 |
|   814231 |   809144 |      1 |
查询1

CREATE TABLE Table1
    ([Object_A] int, [Object_B] int, [Flag_1] int)
;

INSERT INTO Table1
    ([Object_A], [Object_B], [Flag_1])
VALUES
    (809790, 809144, 1),
    (814231, 809144, 1),
    (809790, 510127, 1),
    (809022, 809144, 1),
    (809790, 803745, 1),
    (801250, 782873, 1),
    (809022, 623154, 1),
    (809022, 911310, 1),
    (809022, 573158, 1)
;
update t1
set t1.Flag_1 = 0
from table1 t1
inner join (SELECT t2.Object_A, t2.Object_B, ROW_NUMBER() OVER(PARTITION BY Object_A ORDER BY Object_A, Object_B DESC) AS RowNo
              FROM table1 t2              
            ) t2 on t1.Object_B = t2.Object_B and t1.Object_A = t2.Object_A
where t2.RowNo > 2

select * 
from table1
order by 1,2
| OBJECT_A | OBJECT_B | FLAG_1 |
|----------|----------|--------|
|   801250 |   782873 |      1 |
|   809022 |   573158 |      0 |
|   809022 |   623154 |      0 |
|   809022 |   809144 |      1 |
|   809022 |   911310 |      1 |
|   809790 |   510127 |      0 |
|   809790 |   803745 |      1 |
|   809790 |   809144 |      1 |
|   814231 |   809144 |      1 |

CREATE TABLE Table1
    ([Object_A] int, [Object_B] int, [Flag_1] int)
;

INSERT INTO Table1
    ([Object_A], [Object_B], [Flag_1])
VALUES
    (809790, 809144, 1),
    (814231, 809144, 1),
    (809790, 510127, 1),
    (809022, 809144, 1),
    (809790, 803745, 1),
    (801250, 782873, 1),
    (809022, 623154, 1),
    (809022, 911310, 1),
    (809022, 573158, 1)
;
update t1
set t1.Flag_1 = 0
from table1 t1
inner join (SELECT t2.Object_A, t2.Object_B, ROW_NUMBER() OVER(PARTITION BY Object_A ORDER BY Object_A, Object_B DESC) AS RowNo
              FROM table1 t2              
            ) t2 on t1.Object_B = t2.Object_B and t1.Object_A = t2.Object_A
where t2.RowNo > 2

select * 
from table1
order by 1,2
| OBJECT_A | OBJECT_B | FLAG_1 |
|----------|----------|--------|
|   801250 |   782873 |      1 |
|   809022 |   573158 |      0 |
|   809022 |   623154 |      0 |
|   809022 |   809144 |      1 |
|   809022 |   911310 |      1 |
|   809790 |   510127 |      0 |
|   809790 |   803745 |      1 |
|   809790 |   809144 |      1 |
|   814231 |   809144 |      1 |

示例数据中是否缺少此值:
809022 573158
,因为它在结果中?是的,抱歉。修正了。后来我添加了这一点,以显示每对上可能有3行以上的行,我想更改前两行上每对上的标志。尝试在结果集中创建一个
row\u number()
,并更新
flag\u 1
的值,其中row\u number>2?@NickyvV没有想到这一点。我可以使用“row_number()OVER(按对象划分,按对象排序)作为行”,然后更新行数大于2的每一对。@Kesty已经更新了我的答案。我认为这是正确的方法,但可能仍然存在一些问题。我的数据库中有4万行。如果我对计数(*)大于2的对象进行分组,我会得到4k的结果。我得到的排号>2的版本20k@Kesty但是GROUPBY将合并这些行,因此如果结果有4行,它们将被滚动为1行。其中,行号将是重复行的列表,因为它们具有不同的行号。是的,您是100%正确的。我盯着这个问题看得太久了,需要休息一下:)谢谢你的帮助。我可以做更新,但是更新中你的答案有问题。对象b不是唯一的,因为您可以看到id 809144与多个对象A成对出现。因此,您的更新将使用select中的objectB更新每一对。您可以在新字段中看到错误。我所做的是在表上添加一个自动递增索引,并对索引而不是ObjectB进行更新。也许有更好的选择。我们能解决这个问题吗,这样我就不必拒绝了?如果你加入
t1.Object\u B=t2.Object\u B和t1.Object\u A=t2.Object\u A
像这样: