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或更老的版本。