我正在尝试在 Oracle 中使用 LEFT JOIN 连接两个表。我只需要包含“正确”连接表中的第一条记录。
请参阅以下示例:
表A
code | emp_no
101 | 11111
102 | 22222
103 | 33333
104 | 44444
105 | 55555
表B
code | city | county
101 | City1 | Country1
101 | City2 | Country1
101 | City3 | Country1
102 | City4 | Country2
103 | City5 | Country3
预期输出:
code | emp_no | city | county
101 | 11111 | City1 | Country1
102 | 22222 | City4 | Country2
103 | 33333 | City5 | Country3
104 | 44444 | NULL | NULL
105 | 55555 | NULL | NULL
我需要从表 B 中选择第一个匹配的记录并忽略所有其他行。
上面的查询假设有效:
SELECT *
FROM TABLE_A a
LEFT JOIN TABLE_B b ON b.CODE = a.CODE
AND b.CODE =
(
SELECT CODE
FROM TABLE_B
WHERE ROWNUM = 1
)
但我收到错误:ORA-01799: a column may not be external-joined to a subquery
我怎样才能做到这一点?
谢谢
您可以使用min()
aggrenate函数的keep (dense_rank first ...)
语法来从外连接表“第一个”匹配的数据:
select a.code, a.emp_no,
min(b.city) keep (dense_rank first order by city, county) as city,
min(b.county) keep (dense_rank first order by city, county) as county
from table_a a
left join table_b b on b.code = a.code
group by a.code, a.emp_no
order by a.code, a.emp_no;
CODE EMP_NO CITY COUNTY
---------- ---------- ----- --------
101 11111 City1 Country1
102 22222 City4 Country2
103 33333 City5 Country3
104 44444
105 55555
不过,您必须定义“第一”的含义 - 我已经city, county
在 keep 子句中使用 order by ,但是您可能还有另一列您没有显示应该指示顺序。
(您可以按 null 排序以使其有点随意,但这通常不是一个好主意,尤其是因为稍后运行相同的查询可能会为相同的数据提供不同的结果。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句