oracle 如何在SQL查询中编写此语句

nhjlsmyf  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(124)

我必须从Table_1中获取PROJECT的详细信息,主键是PROJECT_ID。
但是这个Table_1保存了针对同一个project_id的几行“report_code”的详细信息。
我只需要提取那些没有report_code“COSTS”的项目。
一个项目可以有几行COSTS代码和TIME代码。

5us2dqdw

5us2dqdw1#

要提取没有报告代码“COSTS”的项目,可以使用以下SQL查询:

SELECT DISTINCT PROJECT_ID
FROM Table_1
WHERE PROJECT_ID NOT IN (
  SELECT PROJECT_ID
  FROM Table_1
  WHERE report_code = 'COSTS'
);

1.外部查询从Table_1中选择不同的项目ID。

  1. WHERE子句过滤掉report_code = 'COSTS'的项目ID。这是使用选择report_code = 'COSTS'的项目ID的子查询来完成的,NOT IN运算符从外部查询的结果中排除这些项目ID。
    此查询将返回一个没有报表代码“COSTS”的项目ID列表。如果需要有关这些项目的其他详细信息,可以使用项目ID作为联接键将此查询的结果与原始表联接。
wko9yo5t

wko9yo5t2#

主键是PROJECT_ID
但是这个Table_1保存了几行report_code的细节,而project_id是相同的。
这是没有意义的,因为主键是唯一的,只能出现一次。如果我们假设它不是主键,并且根据你的描述,它确实出现了多次,那么你可以使用COUNT分析函数的条件聚合(通过一次表扫描来完成):

SELECT *
FROM   (
  SELECT t.*,
         COUNT(CASE report_code WHEN 'COSTS' THEN 1 END)
           OVER (PARTITION BY project_id) AS num_costs_reports
  FROM   table_1 t
)
WHERE  num_costs_reports = 0

如果project_id是主键,那么每个project_id只能出现一次,你只需要:

SELECT *
FROM   table_1 
WHERE  report_code IS NULL
OR     report_code != 'COSTS'

相关问题