Sql 在具有结果的组中查找测试-Oracle 12

Sql 在具有结果的组中查找测试-Oracle 12,sql,oracle,Sql,Oracle,我必须确定是否有任何容器组在多个容器组中进行了测试,并且有任何结果 我觉得我需要一个简单的循环,但无法在我的脑海中构建它。有一组4个表格,将容器中的所有点连接到测试,然后连接到结果 表con_组1包含容器组。表containers2包含容器组ID、单个容器ID和测试组ID。表测试组3包含测试组id和测试id,表测试4包含测试id和结果id。表5包含结果 我需要确定哪些容器有测试结果。结果是什么并不重要,只是容器中包含的每个测试是否都有结果 ----------------------------

我必须确定是否有任何容器组在多个容器组中进行了测试,并且有任何结果

我觉得我需要一个简单的循环,但无法在我的脑海中构建它。有一组4个表格,将容器中的所有点连接到测试,然后连接到结果

con_组1
包含容器组。表
containers2
包含容器组ID、单个容器ID和测试组ID。表
测试组3
包含测试组id和测试id,表
测试4
包含测试id和结果id。
表5
包含结果

我需要确定哪些容器有测试结果。结果是什么并不重要,只是容器中包含的每个测试是否都有结果

------------------------------------
|  Container  |   Test   |  Result |
------------------------------------
|    8        |    69    |         |
|    9        |    87    |    8    |
|    8        |    45    |         |
|    6        |    58    |         |
|    9        |    95    |    5    |
------------------------------------
所需结果:

------------------------- 
| Container Group |           |
-------------------------
|        2     |    done   |
|        1     |    open   |
|        3     |    open   |
-------------------------

{CREATE TABLE CONTAINERS2
(CON_GROUP  NUMBER(10),
CONTAINER  NUMBER(10));

CREATE TABLE CON_GROUP1
(CON_GROUP  NUMBER(10));
CREATE TABLE TESTS4
(RESULT_ID  NUMBER(10),
  TEST       NUMBER(10));

CREATE TABLE TEST_GROUPS3
(CONTAINER  NUMBER(10),
TEST       NUMBER(10));

INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (1, 8);
INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (3, 6);
INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (2, 9);
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(1);
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(2);
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(3);

 INSERT INTO TESTS4(RESULT_ID, TEST) VALUES (8, 87);
 INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES (NULL, 45);
 INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES(NULL, 58);
 INSERT INTO TESTS4  (RESULT_ID, TEST) VALUES (NULL, 69);
 INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES(5, 95);

 INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES(8, 45);
 INSERT INTO TEST_GROUPS3 (CONTAINER, TEST) VALUES(9, 87);
 INSERT INTO TEST_GROUPS3 (CONTAINER, TEST) VALUES(6, 58);
 INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES (8, 69);
 INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES (9, 95);}

您需要计算每个容器的测试数量和每个容器的测试结果数量,并比较两个结果集。此解决方案使用子查询获取两个计数和一个外部联接(因为可能一组测试根本没有结果):


一系列左联接和分组方式可以完成此任务:

SELECT cg.con_group,
       max( CASE WHEN result_id IS NULL
                 THEN 'Open' ELSE 'Closed'
            END ) As Result
FROM con_group1 cg
LEFT JOIN CONTAINERS2 co ON co.con_group = cg.con_group 
LEFT JOIN TEST_GROUPS3 tg ON tg.container = co.container
LEFT JOIN TESTS4 t4 ON t4.TEST = tg.TEST
GROUP BY cg.con_group
演示:


。。。需要确定符合条件的容器组,而不是容器。。 集装箱必须经过鉴定才能获得集装箱组 资格

如果我很了解这一要求,您需要:

SELECT cg.con_group,
       co.CONTAINER,
       max( CASE WHEN result_id IS NULL
                 THEN 'Open' ELSE 'Closed'
            END ) As Result
FROM con_group1 cg
LEFT JOIN CONTAINERS2 co ON co.con_group = cg.con_group 
LEFT JOIN TEST_GROUPS3 tg ON tg.container = co.container
LEFT JOIN TESTS4 t4 ON t4.TEST = tg.TEST
GROUP BY cg.con_group,
         co.CONTAINER
演示:


从远处看很好看。我会申请我的数据/表格结构,如果它能满足我的需要,我会做标记…谢谢!!你的代码揭示了一个事实,我错报了这个问题。。。我需要确定哪些容器组符合条件,而不是容器。。集装箱必须经过鉴定才能获得集装箱组鉴定。。
| con_group | result |
|-----------|--------|
|         1 |   Open |
|         3 |   Open |
|         2 | Closed |
SELECT cg.con_group,
       co.CONTAINER,
       max( CASE WHEN result_id IS NULL
                 THEN 'Open' ELSE 'Closed'
            END ) As Result
FROM con_group1 cg
LEFT JOIN CONTAINERS2 co ON co.con_group = cg.con_group 
LEFT JOIN TEST_GROUPS3 tg ON tg.container = co.container
LEFT JOIN TESTS4 t4 ON t4.TEST = tg.TEST
GROUP BY cg.con_group,
         co.CONTAINER
| con_group | container | result |
|-----------|-----------|--------|
|         1 |         8 |   Open |
|         2 |         9 | Closed |
|         3 |         6 |   Open |