当前位置: 首页 > 面试题库 >

合并查询返回ORA-30926:无法在源表中获得稳定的行集

穆单鹗
2023-03-14
问题内容

我有两个合并查询,一个接一个地触发

第一次查询

merge into MyTable
using
(   
select distinct nullLogSetId.Id as IdToUpdate,
       knownLogSetId.LogSetId LogSetIdToUpdateTo
from MyTable knownLogSetId 
join MyTable nullLogSetId
  on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType
 and knownLogSetId.Identifier = nullLogSetId.Identifier 
where

    knownLogSetId.IdentifierType = 'ABC'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
)
on (Id = IdToUpdate)
when matched then
update set LogSetId = LogSetIdToUpdateTo

第二查询

merge into MyTable
using
(

  select distinct nullLogSetId.Id as IdToUpdate,
                  knownLogSetId.LogSetId LogSetIdToUpdateTo
  from MyTable knownLogSetId 
  join MyTable nullLogSetId
    on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType 
   and knownLogSetId.Identifier = nullLogSetId.Identifier 
  where 
    knownLogSetId.IdentifierType = 'DEF'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
) on (Id = IdToUpdate)
when matched then
update set LogSetId = LogSetIdToUpdateTo

我正在使用OracleCommand从.NET一次又一次地调用这些查询

第一个工作正常,但是当第二个被触发时,我得到了错误

ORA-30926:无法在源表中获得稳定的行集

如果您看到我在两个查询中都使用了distinct,那么我已经阅读了所有有关relevent的问题,并从我的角度进行了尝试,因此重复行不是问题。能否请任何人帮助我解决我做错的事情,这可能是基本问题,因为我是刚接触查询的人,请帮助我


问题答案:

如果您看到我在两个查询中都使用了distinct,那么行的重复不是问题。

您可能有重复的数据与其他列一起使用时 DISTINCT ,不能保证您具有IdToUpdate唯一性。看:

CREATE TABLE #MyTable(IdToUpdate INT, LogSetIdToUpdateTo INT);

INSERT INTO #MyTable VALUES (1,1), (1,2), (2,1),(3,1);

SELECT DISTINCT IdToUpdate, LogSetIdToUpdateTo
FROM #MyTable;

**[LiveDemo](https://data.stackexchange.com/stackoverflow/query/387950)**

你会得到IdToUpdate两次。检查您的数据:

with cte AS (
  select distinct nullLogSetId.Id as IdToUpdate,
                  knownLogSetId.LogSetId LogSetIdToUpdateTo
  from MyTable knownLogSetId 
  join MyTable nullLogSetId
    on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType 
   and knownLogSetId.Identifier = nullLogSetId.Identifier 
  where 
    knownLogSetId.IdentifierType = 'DEF'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
)
SELECT IdToUpdate, COUNT(*) AS c
FROM cte
GROUP BY IdToUpdate
HAVING COUNT(*) > 1;

一种可行的方法是使用聚合函数,(MAX/MIN)而不是DISTINCT

merge into MyTable
using
(

  select nullLogSetId.Id as IdToUpdate,
         MAX(knownLogSetId.LogSetId) AS LogSetIdToUpdateTo 
  from MyTable knownLogSetId 
  join MyTable nullLogSetId
    on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType 
   and knownLogSetId.Identifier = nullLogSetId.Identifier 
  where 
    knownLogSetId.IdentifierType = 'DEF'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
  GROUP BY nullLogSetId.Id
) on (Id = IdToUpdate)
when matched then
update set LogSetId = LogSetIdToUpdateTo


 类似资料:
  • irb(main):005:0>driver=Selenium::WebDriver.for:firefox Selenium::WebDriver::错误::WebDriver错误:无法在60秒内从C:/ruby21/lib/ruby/gems/2.1.0/gems/selenium-WebDriver-2.45.0/lib/Se Lenium/WebDriver/2.1.0/gems/sele

  • 问题内容: 我的Firefox使用了selenium,但是今天早晨,当我运行测试时,我遇到了同样的错误。我将selenium- webdriver更新为当前版本(2.38),但仍然存在该错误。 也 我在我拥有2.35版本的其他项目中进行了检查,该项目昨天也可以使用-那里今天也无法使用; o 所以我想那不是selenium的问题,但是我的FF会被破坏吗?但是我也尝试使用自定义firefox_path

  • 本文向大家介绍Mybatis查询多条记录并返回List集合的方法,包括了Mybatis查询多条记录并返回List集合的方法的使用技巧和注意事项,需要的朋友参考一下 实体对象如下: XML映射文件如下: 接口文件方法如下: 测试文件如下: 笔记: XML中只需resultType属性值为实体对象别名或全路径名。 mybatis会通过接口文件的返回值类型来判断返回的是集合还是对象。如果是对象,则按常规

  • 我在Google Sheets中创建了一个预算跟踪器。我有麻烦与谷歌查询语言返回的结果不存在于源数据 我有一个谷歌表格,可以输入支出,它填充了我的谷歌驱动器中的相关工作表。我的主预算跟踪器也位于我的谷歌驱动器中。我使用IMPORTRANGE将数据从响应电子表格中拉入Master,然后通过查询将其分成工作簿中工作表上的不同“支出”类别(每月一个)。二月工作得很好——所有的支出都被正确地找到和总结,然

  • 通过测试场景时,我在运行测试时遇到以下错误 无法在60秒内获得稳定的firefox连接(127.0.0.1:7055)(Selenium::WebDriver::Error::WebDriverError) 使用和 使用、和其他几个gem,我还添加了gem,但它们似乎不是问题。我使用的是。

  • 我正试图从一个基于以下指南编写的简单的Android摄像头应用程序中获得稳定的帧速率。http://developer.android.com/guide/topics/media/camera.html-非故意版本。只有预览,没有图像或视频捕获。每次调用onPreview(实现previewcallback)时,我都会检查时间戳差异以测量帧速率。虽然它平均满足我设置的15 FPS速率(setPr