guc*_*cce 0 sql oracle oracle12c
Oracle DB版本:
SELECT * FROM v$version
WHERE banner LIKE 'Oracle%';
-- OUTPUT
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用两个条件外连接三个表,以便缺少值只显示为.请参阅以下详细信息.NULL
下表是抽象,因此请不要尝试改进数据模型本身.
主键= ID
| ID | MEAS_NAME |
|------|-----------------|
| 1000 | "Measurement 1" |
Run Code Online (Sandbox Code Playgroud)
主键=(ID,NAME)
外键ID=MEASUREMENT.ID
| ID | NAME | AREA |
|------|-----------|------|
| 1000 | "Point 1" | 10 |
| 1000 | "Point 2" | 20 |
Run Code Online (Sandbox Code Playgroud)
主键=(ID,NAME)
外键ID=MEASUREMENT.ID
| ID | NAME | VOLUME |
|------|-----------|--------|
| 1000 | "Point 1" | 100 |
| 1000 | "Point 3" | 200 |
Run Code Online (Sandbox Code Playgroud)
我想要的是以下输出:
| ID | MEAS_NAME | NAME | AREA | VOLUME |
|------|-----------------|-----------|------|--------|
| 1000 | "Measurement 1" | "Point 1" | 10 | 100 |
| 1000 | "Measurement 1" | "Point 2" | 20 | NULL |
| 1000 | "Measurement 1" | "Point 3" | NULL | 200 |
Run Code Online (Sandbox Code Playgroud)
这意味着,如果一个特定的MEASUREMENT.ID和具体的NAME有两个数据AREA,并VOLUME随后把它们放在同一行.否则,只需将AREA或VOLUME字段留空即可.
我想出了以下SQL语句,它不起作用,它丢弃了以下结果MEASUREMENT_VOLUME:
SELECT meas.ID AS "ID",
meas.MEAS_NAME AS "MEAS_NAME",
COALESCE (area.NAME, vol.NAME) as "NAME",
area.AREA, vol.VOLUME
FROM MEASUREMENT meas
LEFT JOIN MEASUREMENT_AREA area
ON meas.ID = area.ID
FULL JOIN MEASUREMENT_VOLUME vol
ON meas.ID = vol.ID AND area.NAME = vol.NAME
WHERE meas.ID = 1000;
Run Code Online (Sandbox Code Playgroud)
如果我把MEASUREMENT它放在最后它工作,但查询非常慢:
SELECT meas.ID AS "ID",
meas.MEAS_NAME AS "MEAS_NAME",
COALESCE (area.NAME, vol.NAME) as "NAME",
area.AREA, vol.VOLUME
FROM MEASUREMENT_AREA area
FULL JOIN MEASUREMENT_VOLUME vol
ON area.ID = vol.ID AND area.NAME = vol.NAME
JOIN MEASUREMENT meas
ON meas.ID = vol.ID OR meas.ID = area.ID
WHERE meas.ID = 1000;
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助,我不是SQL专家.
MEASUREMENT包含恰好一次测量的元数据MEASUREMENT_AREA并且MEASUREMENT_VOLUME比MEASUREMENT它们大得多,每个都包含超过1000万行为什么一个查询有效,另一个没有在另一个答案中解释.所以我只想添加我编写查询的方式:
你想的完全外部联接measurement_area和measurement_volume.在子查询中执行此操作并与measurement表连接:
select id, m.meas_name, data.name, data.area, data.volume
from measurement m
join
(
select id, name, ma.area, mv.volume
from measurement_area ma
full outer join measurement_volume mv using (id, name)
) data using(id);
Run Code Online (Sandbox Code Playgroud)