4

我有如下三个表:

测试

    +--------------+--------+
    | Test_Case_ID | Status |
    +--------------+--------+
    |           10 | PASS   |
    |           20 | FAIL   |
    |           30 | FAIL   |
    +--------------+--------+

缺点

    +-----------+
    | Defect_ID |
    +-----------+
    |       500 |
    |       400 |
    +-----------+

链接1

    +--------------+-----------+
    | Test_Case_ID | Defect_ID |
    +--------------+-----------+
    |           20 |       500 |
    |           30 |       500 |
    |           30 |       400 |
    +--------------+-----------+

我正在尝试以下查询

select 
test.test_case_id,
test.status,
case when test.status = 'FAIL' then 
(select link1.defect_id 
from link1 
where 
test.test_case_id = link1.test_case_id) 
end as defect1_id
from test test

我收到以下错误“错误 12/20/2012 10:05:17 AM 0:00:00.093 Toad for Data Analysts: ORA-01427: single-row subquery returns more than one row 1 78”

有没有办法从链接表中检索“30”的记录?因为我想显示测试用例 30 由于缺陷 500 和 400 而失败。

非常感谢

4

2 回答 2

4

链接表中有两行的值为“30”。这是你的问题。

你想要这些行中的哪一行?

要修复子查询,您可以说select max(link1.defect_id)或添加and rownum = 1where子句。

你想要的可能更复杂。这个版本怎么样,它将缺陷连接成一个字符串:

select t.test_case_id, t.status,
       listagg(cast(l.defect_id as varchar(32)) within group (order by l.defect_id) as defects
from test t left join
     link1 l
     on t.test_case_id = l.test_case_id
group by t.test_case_id, t.status

您没有指定 Oracle 的版本。如果listagg不可用,那么wm_concat可能是。 是关于在 Oracle 中聚合中连接字符串的不同方法的参考。

于 2012-12-20T15:10:54.440 回答
3

您是否考虑过使用 aJOIN而不是子查询:

select 
  t.test_case_id,
  t.status,
  case when t.status = 'FAIL' then l.defect_id  
    end as defect1_id
from test t
left join link1 l
  on t.test_case_id = l.test_case_id

请参阅带有演示的 SQL Fiddle

这将返回两条记录,然后您可以决定在最终结果中返回哪个项目。

结果:

| TEST_CASE_ID | STATUS | DEFECT1_ID |
--------------------------------------
|           20 |   FAIL |        500 |
|           30 |   FAIL |        500 |
|           30 |   FAIL |        400 |
|           10 |   PASS |     (null) |

根据您的评论,如果您使用的是 Oracle 11g,那么您可以使用该LISTAGG()函数将记录合并为一行:

select 
  t.test_case_id,
  t.status,
  case 
    when t.status = 'FAIL' 
    then listagg(l.defect_id, ', ')
          within group (order by l.defect_id)
  end as defect1_id
from test t
left join link1 l
  on t.test_case_id = l.test_case_id
group by t.test_case_id, t.status

请参阅带有演示的 SQL Fiddle

结果:

| TEST_CASE_ID | STATUS | DEFECT1_ID |
--------------------------------------
|           10 |   PASS |     (null) |
|           20 |   FAIL |        500 |
|           30 |   FAIL |   400, 500 |
于 2012-12-20T15:12:58.467 回答