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