Sql 如何测试返回空记录的子查询

Sql 如何测试返回空记录的子查询,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我有一个查询需要更新另一个表的一些元组,我只需要更新两条记录,每条记录对应的值是从另一个表中获取的,目前我的查询工作正常,没有输入错误,没有错误,但它获取的记录为零,因此我的其他表',我发现我的内部子查询无法获取相关数据,但我无法测试我的内部子查询,因为它需要引用两个表 这是一个问题 UPDATE SALARY_DETAIL_TBL sd SET GROSS_EARNING =(SELECT AMOUNT FROM SALARY_DETAIL_REPORT sr WHERE sd.EMP_ID

我有一个查询需要更新另一个表的一些元组,我只需要更新两条记录,每条记录对应的值是从另一个表中获取的,目前我的查询工作正常,没有输入错误,没有错误,但它获取的记录为零,因此我的其他表',我发现我的内部子查询无法获取相关数据,但我无法测试我的内部子查询,因为它需要引用两个表

这是一个问题

UPDATE SALARY_DETAIL_TBL sd
SET GROSS_EARNING =(SELECT AMOUNT FROM SALARY_DETAIL_REPORT sr WHERE sd.EMP_ID = sr.EMP_ID AND sr.PAY_CODE = 997) ,
  GROSS_DEDUCTION =
  (SELECT AMOUNT
  FROM SALARY_DETAIL_REPORT sr
  WHERE sd.EMP_ID = sr.EMP_ID
  AND sr.PAY_CODE = 998
  )
WHERE (GROSS_EARNING IS NULL
OR GROSS_DEDUCTION   IS NULL)
由内部查询填充的GROSS_EARNING和GROSS_Decreation列,该内部查询生成零结果,我想单独测试,请向我推荐最佳解决方案

现在它抛出

UPDATE SALARY_DETAIL_TBL sd
    SET GROSS_EARNING =(SELECT AMOUNT FROM SALARY_DETAIL_REPORT sr WHERE sd.EMP_ID = sr.EMP_ID AND sr.PAY_CODE = 997) ,
      GROSS_DEDUCTION =
      (SELECT AMOUNT
      FROM SALARY_DETAIL_REPORT sr
      WHERE sd.EMP_ID = sr.EMP_ID
      AND sr.PAY_CODE = 998
      )
    WHERE (GROSS_EARNING IS NULL
    OR GROSS_DEDUCTION   IS NULL)

BadSqlGrammerException: single-row subquery returns more than one row

您可以通过查询检查表中是否存在数据

SELECT AMOUNT 
  FROM SALARY_DETAIL_REPORT sr 
 WHERE sr.EMP_ID in(select EMP_ID  
                      from SALARY_DETAIL_TBL sd 
                      where (GROSS_EARNING IS NULL
                             OR GROSS_DEDUCTION   IS NULL) 
                    )  
  AND sr.PAY_CODE in (997,998)

您可以通过查询检查表中是否存在数据

SELECT AMOUNT 
  FROM SALARY_DETAIL_REPORT sr 
 WHERE sr.EMP_ID in(select EMP_ID  
                      from SALARY_DETAIL_TBL sd 
                      where (GROSS_EARNING IS NULL
                             OR GROSS_DEDUCTION   IS NULL) 
                    )  
  AND sr.PAY_CODE in (997,998)

并且您可以使用检查是否存在未引用的数据

SELECT AMOUNT 
  FROM SALARY_DETAIL_REPORT sr 
 WHERE sr.EMP_ID not in(select EMP_ID  
                      from SALARY_DETAIL_TBL sd 
                      where (GROSS_EARNING IS NULL
                             OR GROSS_DEDUCTION   IS NULL) 
                    )  
  AND sr.PAY_CODE in (997,998)

并且您可以使用检查是否存在未引用的数据

SELECT AMOUNT 
  FROM SALARY_DETAIL_REPORT sr 
 WHERE sr.EMP_ID not in(select EMP_ID  
                      from SALARY_DETAIL_TBL sd 
                      where (GROSS_EARNING IS NULL
                             OR GROSS_DEDUCTION   IS NULL) 
                    )  
  AND sr.PAY_CODE in (997,998)

好的,似乎有多行具有相同的emp\u id和相同的支付代码。 您应该首先检查这是否正确,如果正确,请定义一个策略来选择哪个是更新另一个表的正确策略,否则只需删除错误的行即可。 例如,如果行中有某个日期,则可以按该日期排序,并将结果限制为1

(SELECT AMOUNT
      FROM SALARY_DETAIL_REPORT sr
      WHERE sd.EMP_ID = sr.EMP_ID
      AND sr.PAY_CODE = 998
ORDER BY sr.some_column_that_makes_sense
FETCH FIRST 1 ROWS ONLY)

好的,似乎有多行具有相同的emp\u id和相同的支付代码。 您应该首先检查这是否正确,如果正确,请定义一个策略来选择哪个是更新另一个表的正确策略,否则只需删除错误的行即可。 例如,如果行中有某个日期,则可以按该日期排序,并将结果限制为1

(SELECT AMOUNT
      FROM SALARY_DETAIL_REPORT sr
      WHERE sd.EMP_ID = sr.EMP_ID
      AND sr.PAY_CODE = 998
ORDER BY sr.some_column_that_makes_sense
FETCH FIRST 1 ROWS ONLY)

你有两项任务:

GROSS_EARNING =
 (SELECT AMOUNT FROM SALARY_DETAIL_REPORT sr
  WHERE sd.EMP_ID = sr.EMP_ID AND sr.PAY_CODE = 997)

您希望两个函数最多返回一行

因此,请检查是否存在每个支付代码具有多个匹配项的EMP\u ID:


你有两项任务:

GROSS_EARNING =
 (SELECT AMOUNT FROM SALARY_DETAIL_REPORT sr
  WHERE sd.EMP_ID = sr.EMP_ID AND sr.PAY_CODE = 997)

您希望两个函数最多返回一行

因此,请检查是否存在每个支付代码具有多个匹配项的EMP\u ID:


谢谢亲爱的,但是我的内部查询有什么问题,它应该获取正确的数据,我仍然对此感到困惑。你能猜出来吗?@user9634982没什么问题。因为我不知道您表中的数据是什么样子的,所以我不能更准确地说我修复了查询,但现在它抛出了一个SQLGrameRexception,请参阅我最近的edit@user9634982正如异常所说,子查询返回多个值。在SALARY_DETAIL_报告表中,EMP_ID和ID为997或998的记录不止一条。在这里,您必须将查询限制为正确的值,谢谢亲爱的,但是我的内部查询有什么问题,它应该获取正确的数据,我仍然对此感到困惑。你能猜出来吗?@user9634982没什么问题。因为我不知道您表中的数据是什么样子的,所以我不能更准确地说我修复了查询,但现在它抛出了一个SQLGrameRexception,请参阅我最近的edit@user9634982正如异常所说,子查询返回多个值。在SALARY_DETAIL_报告表中,EMP_ID和ID为997或998的记录不止一条。在这里,您必须将查询限制为正确的值,谢谢亲爱的,但是我的内部查询有什么问题,它应该获取正确的数据,我仍然对此感到困惑。你能猜出来吗?请不要在一个帖子上发布多个答案。这是一个问答网站,不是论坛。如果您需要修改或澄清回答,请编辑您的第一个答案,而不是添加第二个答案。对不起,我会这样做,我是新的堆栈溢出谢谢亲爱的,但我的内部查询有什么问题,它应该获取正确的数据,我仍然对此感到困惑。你能猜出来吗?请不要在一个帖子上发布多个答案。这是一个问答网站,不是论坛。如果您需要修改或澄清答复,请编辑您的第一个答复,而不是添加第二个答复。抱歉,我会这样做,我是堆栈溢出限制的新手oracleright中不存在此问题,抱歉!我编辑了代码,请尝试偏移0行仅获取下一行或获取前1行以清除此语法。每个人都应该使用12c,因为所有旧版本都已弃用,基本上不受支持。但许多组织仍在使用11g或更旧版本。oracleright中不存在限制,抱歉!我编辑了代码,请尝试偏移0行仅获取下一行或获取前1行以清除此语法。每个人都应该使用12c,因为所有旧版本都已弃用,基本上不受支持。但很多组织仍然在使用11g或更老的版本。