多对一合并SQL

时间:2019-07-25 20:58:17

标签: sql join merge set

我有三个表,如下所示:

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

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

3 个答案:

答案 0 :(得分:0)

您将需要第四个表PersonCity以及PersonID和CityID链接在一起。将关系数据库想像成网格(电子表格,道路)。如果您要往北走,并且想要走的路是平行的(想想| ^ | | ^ |),您将需要使用连接这两者的另一条路。当前,您没有这样的路径。

答案 1 :(得分:0)

简短的回答是您的表不足以完成任务,您需要遵循以下原则:

Table_1                   Table_2          Table_3 
Id  Name   PIN            Id   City        Name_id City_id  
1   David  1948           1    Roma        1        3
2   Susan  1245           2    Berlin      2        2
3   Jack   1578           3    New York    3        3
4   Hans   1247                            4        2
5   Rose   8745                            5        1  

然后您可以按照以下方式进行查询:

   SELECT T1.Name, T1.PIN, T2.City
       FROM Table_1 T1 LEFT JOIN Table_3 T2 ON T1.Id = T3.Name_id
       LEFT JOIN Table_2 ON T3.City_id = T2.Id
       ORDER BY T1.Name

或者您可以ORDER BY城市,名字

答案 2 :(得分:0)

我有好消息和坏消息。

好消息,鉴于表在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 REALLY 支持,因为您无法押注所获得的收益。这在大多数其他数据库中将不起作用。

唯一正确的方法是@daShier提供的内容,您必须在其中添加一些内容(例如ID),以允许按所需顺序连接行。