首页 > 解决方案 > 多对一合并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

首先,我可以合并第二个和第三个表,然后将结果表与第一个表合并,但我想在没有中表的情况下解决这个问题。我该如何处理?如何根据第三个表将第一个表的行与第二个表中的指定行按顺序组合?

标签: sqljoinmergeset

解决方案


我有好消息和坏消息。

好消息是,在 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,以允许按照您想要的顺序连接行。


推荐阅读