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

Sql 如何仅基于行数()更新行?

Sql 如何仅基于行数()更新行?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,此类SQL查询: SELECT ROW_NUMBER() OVER (PARTITION BY ID, YEAR order by ID ), ID, YEAR from table t 请给出以下查询集: 1 1000415591 2012 1 1000415591 2013 2 1000415591 2013 1 1000415591 2014 2 1000415591 2014 如何更新行数等于2的记录?此记录的其他字段与表中的select distinc

此类SQL查询:

SELECT ROW_NUMBER() OVER (PARTITION BY ID, YEAR order by ID ), ID, YEAR
from table t
请给出以下查询集:

1   1000415591  2012
1   1000415591  2013
2   1000415591  2013
1   1000415591  2014
2   1000415591  2014
如何更新行数等于2的记录?此记录的其他字段与表中的select distinct相同,其中id=1000415591在有5条记录没有distinct关键字时给出3条记录,因此我只能依赖于行数值

我需要Oracle的解决方案,因为我看到了SQL Server的类似解决方案,但它不能与Oracle一起工作。

您可以使用非常详细且易于理解的合并语句

比如说,

MERGE INTO t s 
USING
(SELECT ROW_NUMBER() OVER (PARTITION BY ID, YEAR order by ID ) RN,
  ID,
  YEAR
FROM TABLE t
) u ON (s.id = u.id)
WHEN MATCHED THEN
  UPDATE SET YEAR = some_value WHERE u.RN = 2)
/

注意,您不能合并用于加入ON子句的同一列。

当我发布thq问题时,我发现这可能是错误的方法。我可以修改表并添加新字段。因此,更好的解决方案是再创建一个字段标识,并使用新序列中从1到总行数的数字对其进行更新。然后我可以根据这个相同的字段更新字段

如果有人提出基于行数解析函数的解决方案,我会继续回答这个问题

update TABLE set NEW_ID = TABLE_SEQ.nextval 
where IDENTITY in (
    select IDENTITY from (
        select row_number() over(PARTITION BY ID, YEAR order by ID) as row_num, t.ID, t."YEAR", t.IDENTITY
        from TABLE t
    ) where row_num > 1
)

这不是update语句,而是如何获取要更新的2行:

SELECT * 
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ID, YEAR order by ID ) as rn, ID, YEAR
from t )
where rn = 2
尝试使用字段:

如果需要删除行号范围,则:

UPDATE T
SET t.year = t.year*1000
WHERE rowid in ( SELECT rowid FROM
                 ( 
                   SELECT rowid,
                           ROW_NUMBER() 
                              OVER (PARTITION BY ID, t.YEAR order by ID ) as RN
                    FROM T
                  ) T2 WHERE RN >=2 AND RN <=10
                  )

你能为SQL Server添加一些类似的东西吗?它可能会加快速度,还有你的表到底是什么样子的?我尝试创建一个SQLFIDLE,但似乎无法得到与该查询相同的结果:@JeremyC。因为您的表名不正确。你刚才也注意到了这一点,但是谢谢:D,不是表名不正确吗?是“table”关键字不属于there@JeremyC. 似乎您将别名t放在了表_name table;-无论如何,FROM子句中不需要table关键字。此代码导致ORA-30926:无法在源代码中获取一组稳定的行tables@Dracontis这是因为子查询返回的不是唯一的行,而是多行。关注USING子句和on子句。我没有您的表数据来复制您的测试用例。我已经在上面的注释中尝试了这种SQL-to-sqlfiddle。与我的表数据相同的ORA-30926错误。我不能100%确定这是否有用,因为我现在不知道如何更新这些行:问题是,只有行号字段的行不同,没有行号字段的行相同。您可以尝试使用主键、id和年份创建一个新表,将当前表中的每一行复制到新表中,运行我在这里提出的查询以从该新表中获取主键,并在该查询的结果中id所在的表上运行update,这可能是一种迂回的方法,但也有可能,这意味着您必须开始使用新表,而不是旧表。它接近我需要的。但是如果行号在2到10之间呢?@Dracontis我添加了第二个关于行号范围的查询,我刚刚添加了相同的版本。是的,这正是我想要实现的。请使用问题的编辑链接添加其他信息。“发布答案”按钮只能用于问题的完整答案。这是答案,不是问题的补充。当您需要更新重复的行时,这是一个可能的解决方案。但这不是正确和理想的解决方案,这就是为什么我没有把它标记为答案。
UPDATE T
SET t.year = t.year*1000
WHERE rowid in ( SELECT rowid FROM
                 ( 
                   SELECT rowid,
                           ROW_NUMBER() 
                              OVER (PARTITION BY ID, t.YEAR order by ID ) as RN
                    FROM T
                  ) T2 WHERE RN >=2 AND RN <=10
                  )