Oracle SQL: 尝试查询数据时出现重复行
Oracle SQL: Duplicate rows when trying to query data
Table答:
植物编号
植物名称
单位名称
技术类型
1
ABC
第 1 单元
SMR
1
ABC
第 2 单元
电解
Table乙:
植物编号
原料类型
1
天然气
1
水
select
a.PLANT_NAME,
a.UNIT_NAME,
b.FEEDSTOCK_TYPE,
a.TECHNOLOGY_TYPE
from
Table A a
inner join Table B b
on a.plant_ID = b.plant_ID
当我运行代码时,结果会是
植物名称
单位名称
技术类型
原料
ABC
第 1 单元
SMR
天然气
ABC
第 1 单元
SMR
水
ABC
第 2 单元
电解
天然气
ABC
第 2 单元
电解
水
但我希望结果是
植物名称
单位名称
技术类型
原料类型
ABC
第 1 单元
SMR
天然气
ABC
第 2 单元
电解
水
问题是我没有 link 每个原料的每个单元的通用主键。我在 2 个表之间只有一个共同的植物 ID。有什么想法吗?提前致谢! :)
你无法得到它,因为无法区分是使用“天然气”还是“水”,因为这两个值在 table_B
中共享相同的 PLANT_ID
。
您可以使用聚合函数获取其中之一,例如MAX
,但这只是一个 变通办法 ,无论如何 return 都不是您想要的。例如(第 1 - 9 行中的示例数据)(注意第 12 行中的 MAX
也需要 GROUP BY
子句):
SQL> with
2 table_a (plantid, plant_name, unit_name, technology_type) as
3 (select 1, 'ABC', 'Unit 1', 'SMR' from dual union all
4 select 1, 'ABC', 'Unit 2', 'Electrolysis' from dual
5 ),
6 table_b (plantid, feedstock_type) as
7 (select 1, 'Natural Gas' from dual union all
8 select 1, 'Water' from dual
9 )
10 select a.plant_name,
11 a.unit_name,
12 max(b.feedstock_type) feedstock_type,
13 a.technology_type
14 from table_a a join table_b b on a.plantid = b.plantid
15 group by a.plant_name, a.unit_name, a.technology_type;
PLA UNIT_NAME FEEDSTOCK_TYPE TECHNOLOGY_TYPE
--- ---------- --------------- ---------------
ABC Unit 2 Water Electrolysis
ABC Unit 1 Water SMR
SQL>
除 plant_id
外,您没有任何内容可 join
。如果要“对齐”行,可以使用 row_number()
:
引入一个新列
select a.PLANT_NAME, a.UNIT_NAME, b.FEEDSTOCK_TYPE, a.TECHNOLOGY_TYPE
from (select a.*,
row_number() over (partition by plant_id order by unit_name) as seqnum
from table_A a
) a join
(select b.*,
row_number() over (partition by plant_id order by feedstock_type) as seqnum
from table_B b
) b
on a.plant_ID = b.plant_ID and a.seqnum = b.seqnum;
table 中没有隐式值,列中只有显式值。您似乎想要将 table A 的“第 1 行”连接到 table B 的“第 1 行”,依此类推。在这种情况下,您需要在每个 table 的列中有一个显式值 1、2、... 并加入该值。
Table答:
植物编号 | 植物名称 | 单位名称 | 技术类型 |
---|---|---|---|
1 | ABC | 第 1 单元 | SMR |
1 | ABC | 第 2 单元 | 电解 |
Table乙:
植物编号 | 原料类型 |
---|---|
1 | 天然气 |
1 | 水 |
select
a.PLANT_NAME,
a.UNIT_NAME,
b.FEEDSTOCK_TYPE,
a.TECHNOLOGY_TYPE
from
Table A a
inner join Table B b
on a.plant_ID = b.plant_ID
当我运行代码时,结果会是
植物名称 | 单位名称 | 技术类型 | 原料 |
---|---|---|---|
ABC | 第 1 单元 | SMR | 天然气 |
ABC | 第 1 单元 | SMR | 水 |
ABC | 第 2 单元 | 电解 | 天然气 |
ABC | 第 2 单元 | 电解 | 水 |
但我希望结果是
植物名称 | 单位名称 | 技术类型 | 原料类型 |
---|---|---|---|
ABC | 第 1 单元 | SMR | 天然气 |
ABC | 第 2 单元 | 电解 | 水 |
问题是我没有 link 每个原料的每个单元的通用主键。我在 2 个表之间只有一个共同的植物 ID。有什么想法吗?提前致谢! :)
你无法得到它,因为无法区分是使用“天然气”还是“水”,因为这两个值在 table_B
中共享相同的 PLANT_ID
。
您可以使用聚合函数获取其中之一,例如MAX
,但这只是一个 变通办法 ,无论如何 return 都不是您想要的。例如(第 1 - 9 行中的示例数据)(注意第 12 行中的 MAX
也需要 GROUP BY
子句):
SQL> with
2 table_a (plantid, plant_name, unit_name, technology_type) as
3 (select 1, 'ABC', 'Unit 1', 'SMR' from dual union all
4 select 1, 'ABC', 'Unit 2', 'Electrolysis' from dual
5 ),
6 table_b (plantid, feedstock_type) as
7 (select 1, 'Natural Gas' from dual union all
8 select 1, 'Water' from dual
9 )
10 select a.plant_name,
11 a.unit_name,
12 max(b.feedstock_type) feedstock_type,
13 a.technology_type
14 from table_a a join table_b b on a.plantid = b.plantid
15 group by a.plant_name, a.unit_name, a.technology_type;
PLA UNIT_NAME FEEDSTOCK_TYPE TECHNOLOGY_TYPE
--- ---------- --------------- ---------------
ABC Unit 2 Water Electrolysis
ABC Unit 1 Water SMR
SQL>
除 plant_id
外,您没有任何内容可 join
。如果要“对齐”行,可以使用 row_number()
:
select a.PLANT_NAME, a.UNIT_NAME, b.FEEDSTOCK_TYPE, a.TECHNOLOGY_TYPE
from (select a.*,
row_number() over (partition by plant_id order by unit_name) as seqnum
from table_A a
) a join
(select b.*,
row_number() over (partition by plant_id order by feedstock_type) as seqnum
from table_B b
) b
on a.plant_ID = b.plant_ID and a.seqnum = b.seqnum;
table 中没有隐式值,列中只有显式值。您似乎想要将 table A 的“第 1 行”连接到 table B 的“第 1 行”,依此类推。在这种情况下,您需要在每个 table 的列中有一个显式值 1、2、... 并加入该值。