sql - 多对一合并sql
问题描述
我有如下三个表:
First Table Second Table Third Table
Name PIN Id City City_id
David 1948 1 Roma 3
Susan 1245 2 Berlin 2
Jack 1578 3 New York 3
Hans 1247 2
Rose 8745 1
我想根据第三张表合并第一张和第二张表。结果将是:人
Name PIN City
David 1948 New York
Susan 1245 Berlin
Jack 1578 New York
Hans 1247 Berlin
Rose 8745 Roma
首先,我可以合并第二个和第三个表,然后将结果表与第一个表合并,但我想在没有中表的情况下解决这个问题。我该如何处理?如何根据第三个表将第一个表的行与第二个表中的指定行按顺序组合?
解决方案
我有好消息和坏消息。
好消息是,在 Oracle 中,按照最初指定的方式给定表,这将为您提供类似于您所要求的内容:
---
--- Pay attention, This looks right but it is not!
---
select name,pin,city from
( select name,pin,rownum rn from first ) a,
( select city,id from second) b,
( select id,rownum rn from third ) c
where
a.rn=c.rn AND
b.id=c.id;
NAME PIN CITY
-------------------- ---- --------------------
Rose 8745 Roma
Susan 1245 Berlin
Hans 1247 Berlin
David 1948 New York
Jack 1578 New York
坏消息是这并没有真正起作用并且是在作弊。你会得到结果,但它们可能不是你所期望的,也不一定是一致的。
数据库按自己的顺序排列记录。如果你不指定一个order by
子句,你会得到他们给你的,这可能不是你想要的。这是作弊,因为 Oracle 并不真正支持以这种方式使用 rownum,因为你不能赌你会得到什么。这在大多数其他数据库中不起作用。
唯一正确的方法是@daShier 给出的方法,您必须在其中添加一些东西,例如 ID,以允许按照您想要的顺序连接行。
推荐阅读
- mysql - 将结果加入新表?
- python - Python:如何获取每个项目在多个列表中的位置的统计信息?
- javascript - Promise.all 返回双精度数组
- java - 从树构建 JPA 规范
- azure-cosmosdb - 如何在折叠 gremlin 之后使用以前存储的项目
- javascript - 在 vue 的不同位置渲染两个单选按钮
- python - 基本 HTTPServer 挂在“socket.readinto : return self._sock.recv_into(b)”
- reactjs - 在反应组件中上传图像后无法显示图像
- python - Pandas Dataframe:将混合浮点字符串列拆分为单独的浮点和字符串列
- node.js - 在 npm 脚本中使用子依赖项