甲骨文SQL。如何 select 列值指定条件的特定 ID?
Oracle SQL. How to select specific IDs where value of columns specify criteria?
我有以下 statement/query:
SELECT table1.file_id,
table1.status,
table2.status
FROM table1
INNER JOIN table2 ON table1.file_id = table2.file_id;
结果如下:
FILE ID | Status Table 1 | Status Table 2
-----------------------------------------------------
5500002 | AX | ICS
5500002 | AX | ICSO
5500002 | AXO | ICS
5500003 | AX | ICS
5500003 | AX | ICS
5500003 | AX | ICS
5500004 | NULL | ICSO test
5500004 | AXO | ICS
5500004 | AX | NULL
我需要为每个文件 ID 检查四种状态:
- AX
- AXO
- ICS
- ICSO
我现在只想 运行 select 在涵盖所有四种状态的 File ID
上。如您所见,File ID
出现多次,我希望我的查询 return 仅满足要求的 File ID
,在本例中为 return 5500002和 5500004。
对于 5500004,有一个状态提到 ICSO test
但不管文本的其余部分是否包含 ICSO 在单元格中,它都算作 ICSO。其他状态也一样。
我如何才能将特定 ID 添加到 SELECT 的查询中?
试试下面的方法
SELECT file_id
FROM
(
SELECT table1.file_id,
table1.status as status1,
table2.status as status2
FROM table1
INNER JOIN table2 ON table1.file_id = table2.file_id
) tab
GROUP BY file_id
HAVING COUNT(DISTINCT tab.status1) + COUNT(DISTINCT tab.status2) >= 4
有几种方法可以做到这一点。
对我来说最直接的方法是这样的:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE t1.file_id IN (SELECT file_id FROM table1 WHERE status = 'AX')
AND t1.file_id IN (SELECT file_id FROM table1 WHERE status = 'AXO')
AND t1.file_id IN (SELECT file_id FROM table2 WHERE status = 'ICS')
AND t1.file_id IN (SELECT file_id FROM table2 WHERE status LIKE '%ICSO%');
你也可以这样做:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE EXISTS (SELECT 1 FROM table1 WHERE status = 'AX' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table1 WHERE status = 'AXO' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table2 WHERE status = 'ICS' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table2 WHERE status LIKE '%ICSO%' AND file_id = t1.file_id);
甚至像这样:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE t1.file_id IN (
SELECT file_id FROM table1 WHERE status = 'AX'
INTERSECT
SELECT file_id FROM table1 WHERE status = 'AXO'
INTERSECT
SELECT file_id FROM table2 WHERE status = 'ICS'
INTERSECT
SELECT file_id FROM table2 WHERE status LIKE '%ICSO%');
但是由于隐含的 DISTINCT,INTERSECT 并不总是性能最好的选项。
您必须尝试一下,看看哪一个最适合您。
我有以下 statement/query:
SELECT table1.file_id,
table1.status,
table2.status
FROM table1
INNER JOIN table2 ON table1.file_id = table2.file_id;
结果如下:
FILE ID | Status Table 1 | Status Table 2
-----------------------------------------------------
5500002 | AX | ICS
5500002 | AX | ICSO
5500002 | AXO | ICS
5500003 | AX | ICS
5500003 | AX | ICS
5500003 | AX | ICS
5500004 | NULL | ICSO test
5500004 | AXO | ICS
5500004 | AX | NULL
我需要为每个文件 ID 检查四种状态:
- AX
- AXO
- ICS
- ICSO
我现在只想 运行 select 在涵盖所有四种状态的 File ID
上。如您所见,File ID
出现多次,我希望我的查询 return 仅满足要求的 File ID
,在本例中为 return 5500002和 5500004。
对于 5500004,有一个状态提到 ICSO test
但不管文本的其余部分是否包含 ICSO 在单元格中,它都算作 ICSO。其他状态也一样。
我如何才能将特定 ID 添加到 SELECT 的查询中?
试试下面的方法
SELECT file_id
FROM
(
SELECT table1.file_id,
table1.status as status1,
table2.status as status2
FROM table1
INNER JOIN table2 ON table1.file_id = table2.file_id
) tab
GROUP BY file_id
HAVING COUNT(DISTINCT tab.status1) + COUNT(DISTINCT tab.status2) >= 4
有几种方法可以做到这一点。
对我来说最直接的方法是这样的:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE t1.file_id IN (SELECT file_id FROM table1 WHERE status = 'AX')
AND t1.file_id IN (SELECT file_id FROM table1 WHERE status = 'AXO')
AND t1.file_id IN (SELECT file_id FROM table2 WHERE status = 'ICS')
AND t1.file_id IN (SELECT file_id FROM table2 WHERE status LIKE '%ICSO%');
你也可以这样做:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE EXISTS (SELECT 1 FROM table1 WHERE status = 'AX' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table1 WHERE status = 'AXO' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table2 WHERE status = 'ICS' AND file_id = t1.file_id)
AND EXISTS (SELECT 1 FROM table2 WHERE status LIKE '%ICSO%' AND file_id = t1.file_id);
甚至像这样:
SELECT t1.file_id,
t1.status,
t2.status
FROM table1 t1
INNER JOIN table2 t2
ON t1.file_id = t2.file_id
WHERE t1.file_id IN (
SELECT file_id FROM table1 WHERE status = 'AX'
INTERSECT
SELECT file_id FROM table1 WHERE status = 'AXO'
INTERSECT
SELECT file_id FROM table2 WHERE status = 'ICS'
INTERSECT
SELECT file_id FROM table2 WHERE status LIKE '%ICSO%');
但是由于隐含的 DISTINCT,INTERSECT 并不总是性能最好的选项。
您必须尝试一下,看看哪一个最适合您。