我有三个表,如下所示:
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
首先,我可以合并第二个和第三个表,然后将结果表与第一个表合并,但是我想在没有中型表的情况下解决此问题。我该如何处理?如何根据第三张表依次组合第一张表的行和第二张表中的指定行?
答案 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),以允许按所需顺序连接行。