尝试避免在 Oracle 查询中使用 table 别名导致 "missing right parenthesis" 错误的重复
Trying to avoid duplication in Oracle query with table alias causing "missing right parenthesis" error
我正在尝试编写一个查询,将来自两个 table 的 ID 号列表组合起来。
查询的第一部分 selects 以 'B' 开头并在 2020 年 1 月 1 日之后从包含 ID 主列表的 table 创建的员工 ID 号。查询的第二部分查看另一个包含团队 ID(由两个或多个员工 ID 组成)的 table - 基本上我想 select 任何包含满足第一个查询中的条件。
我有下面的代码,它 returns 正确的数据:
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 语句一起使用的重复...我尝试使用这样的 table 别名:
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
...但这会导致 "missing right parenthesis" 错误。我知道我犯了一些愚蠢的错误,但我已经尝试了很多变体,如果不完全复制 select 就无法让它工作,所以我挥舞着白旗。谁能指出在这种情况下使用 table 别名的正确方法?
编辑
示例数据如下:
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 以及 select 来自 team_master_view
的所有团队 ID,其中该团队 ID 包含员工 ID select 在查询的第一部分输入。
鉴于上述 tables,它将 select 来自 emp_master_view
的 B99,因为它是唯一满足这两个条件的代码(以 'B' 开头并在 Jan 之后创建1 2020)。它还会 select 来自 team_master_view
的 RZF,因为该团队 ID 包含 B99。最终结果集将是两行:
B99
RZF
希望这是有道理的...
因为你想多次使用同一个查询,你可以使用 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;
更新:
在您发布了 table 数据和需求之后,它看起来像是两个 table 之间的简单 JOIN:
SELECT e.emp_id,
t.team_id
FROM
emp_master_view e
JOIN team_master_view t
ON e.emp_id = t.emp_id
WHERE
e.emp_id LIKE 'B%'
AND e.crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd');
我正在尝试编写一个查询,将来自两个 table 的 ID 号列表组合起来。
查询的第一部分 selects 以 'B' 开头并在 2020 年 1 月 1 日之后从包含 ID 主列表的 table 创建的员工 ID 号。查询的第二部分查看另一个包含团队 ID(由两个或多个员工 ID 组成)的 table - 基本上我想 select 任何包含满足第一个查询中的条件。
我有下面的代码,它 returns 正确的数据:
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 语句一起使用的重复...我尝试使用这样的 table 别名:
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
...但这会导致 "missing right parenthesis" 错误。我知道我犯了一些愚蠢的错误,但我已经尝试了很多变体,如果不完全复制 select 就无法让它工作,所以我挥舞着白旗。谁能指出在这种情况下使用 table 别名的正确方法?
编辑
示例数据如下:
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 以及 select 来自 team_master_view
的所有团队 ID,其中该团队 ID 包含员工 ID select 在查询的第一部分输入。
鉴于上述 tables,它将 select 来自 emp_master_view
的 B99,因为它是唯一满足这两个条件的代码(以 'B' 开头并在 Jan 之后创建1 2020)。它还会 select 来自 team_master_view
的 RZF,因为该团队 ID 包含 B99。最终结果集将是两行:
B99
RZF
希望这是有道理的...
因为你想多次使用同一个查询,你可以使用 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;
更新:
在您发布了 table 数据和需求之后,它看起来像是两个 table 之间的简单 JOIN:
SELECT e.emp_id,
t.team_id
FROM
emp_master_view e
JOIN team_master_view t
ON e.emp_id = t.emp_id
WHERE
e.emp_id LIKE 'B%'
AND e.crt_date >= TO_DATE('2020-01-01', 'yyyy-mm-dd');