试图避免在Oracle查询中使用表别名重复,从而导致“缺少右括号”错误

问题描述 投票:0回答:1

我正在尝试编写一个查询,该查询将从两个表中组合一个ID号列表。

查询的第一部分从包含ID主列表的表中选择以'B'开头并于2020年1月1日之后创建的员工ID号。查询的第二部分查看包含团队ID(由两个或多个员工ID组成)的另一个表-基本上,我想选择包含满足第一个查询中条件的员工ID的任何团队ID。

我有下面的代码正在工作,它返回正确的数据:

SELECT 
    emp_id AS id
FROM 
    emp_master_view 
WHERE 
    emp_id IN
(
    SELECT DISTINCT t.team_id AS id
    FROM team_master_view t
    WHERE t.emp_id IN
    (
        SELECT emp_id
        FROM emp_master_view
        WHERE SUBSTR(emp_id, 1, 1) IN ('B')
        AND crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd')
    )
)
UNION SELECT emp_id AS id
FROM emp_master_view
WHERE SUBSTR(emp_id, 1, 1) IN ('B')
AND crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd')

但是,我讨厌需要与联合选择语句一起使用的重复项...我尝试过使用这样的表别名:

SELECT 
    emp_id
FROM 
    emp_master_view 
WHERE 
    emp_id IN
(
    SELECT DISTINCT t.team_id AS emp_id
    FROM team_master_view t
    WHERE team_id IN
    (
        SELECT emp_id
        FROM emp_master_view
        WHERE SUBSTR(emp_id, 1, 1) IN ('B')
        AND crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd')
    ) emp
)
UNION SELECT emp_id
FROM emp

...但是会导致“缺少右括号”错误。我知道我犯了一些愚蠢的错误,但是我尝试了多种变体,并且在没有完全复制选择的情况下无法使其正常工作,所以我挥舞着白旗。在这种情况下,谁能指出使用表别名的正确方法?

编辑

示例数据如下:

[emp_master_view包含每个ID号的主列表,包括团队:

EMP_MASTER_VIEW
+--------+------------+
| emp_id |  crt_date  |
+--------+------------+
| B56    | 2019-11-02 |
| B99    | 2020-03-02 |
| S34    | 2020-03-02 |
| RZF    | 2020-04-01 |
| RQR    | 2020-04-01 |
+--------+------------+

[team_master_view仅包含团队ID,并且团队中每个员工都有一行:

TEAM_MASTER_VIEW
+---------+--------+
| team_id | emp_id |
+---------+--------+
| RZF     | B99    |
| RZF     | B56    |
| RQR     | B56    |
| RQR     | S34    |
+---------+--------+

期望的结果-提取emp_master_view中符合条件的所有ID,也请从team_master_view中选择所有团队ID,其中该团队ID包含在查询的第一部分中选择的一个员工ID。

鉴于上表,它将从emp_master_view中选择B99,因为它是同时满足这两个条件的唯一代码(以“ B”开头,并在2020年1月1日之后创建)。它还会从team_master_view中选择RZF,因为该组ID包含B99。最终结果集将为两行:

B99
RZF

希望如此...

sql oracle alias
1个回答
0
投票

由于您想多次使用同一查询,因此可以对subquery factoring使用WITH子句:

with data as
(
SELECT emp_id AS id
FROM emp_master_view
WHERE SUBSTR(emp_id, 1, 1) IN ('B')
AND crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd')
)
SELECT 
    emp_id AS id
FROM 
    emp_master_view 
WHERE 
    emp_id IN
(
    SELECT DISTINCT t.team_id AS id
    FROM team_master_view t
    WHERE t.emp_id IN
    (
        SELECT emp_id
        FROM data)
)
UNION 
select emp_id from data;
© www.soinside.com 2019 - 2024. All rights reserved.