0

我在 3 张桌子之间做一个 UNION。为了让您了解情况,一张表被视为主表,另外两张表被视为子表。2 个子表对于每种情况始终具有相同数量的记录。所以我想在这3个表之间建立一个联合,在这个联合中我想重复在主表中获取的列中的信息并列出2个子表的信息,其中子表1中的每一行都对应于该行在子表2中。由于专业原因,我无法放置真实的代码,所以这里是一个与我的真实案例相对应的简单示例。考虑一个名为 Author (Author_ID, Author_FirstName, Author_LastName) 的表。该表将是我们的主表。然后考虑我们有一个名为 Adresses (Adress_ID, Street_Coord, Author_ID) 的表,这将是我们的子表 1。然后考虑名为 Cities 的表(City_ID、City_Name、Author_ID)。我们的作者 X 在 2 个城市有 2 个地址。当我执行我的查询时,我得到了完全合乎逻辑的结果 R1,但我想修改我的查询以获得结果 R2。您能帮我更改查询以获得结果 R2 吗?

SQL查询:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       TO_CHAR(NULL) AS "Street_Coord", TO_CHAR(NULL) AS "City_Name"
FROM "Author"
WHERE "Author"."Author_ID"='X'

UNION

SELECT TO_NUMBER(NULL) AS "Author_ID", TO_CHAR(NULL) AS "Author_FirstName", TO_CHAR(NULL) AS "Author_LastName", 
       "Adresses"."Street_Coord", TO_CHAR(NULL) AS "City_Name" 
FROM "Adresses"
WHERE "Adresses"."Author_ID"='X'

UNION

SELECT TO_NUMBER(NULL) AS "Author_ID", TO_CHAR(NULL) AS "Author_FirstName", TO_CHAR(NULL) AS "Author_LastName", 
       TO_CHAR(NULL) AS "Street_Coord", "Cities"."City_Name"
FROM "Cities"
WHERE "Cities"."Author_ID"='X'

结果 R1:

ID_AUTHOR | AUTHOR_FirstName | AUTHOR_LastName | Street_Coord   | City_Name       |
----------------------------------------------------------------------------------
X         |James             | Conor           | NULL           | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | 1245 rich st   | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | 154 music st   | NULL            |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | NULL           | Madrid          |
----------------------------------------------------------------------------------
X         |NULL              | NULL            | NULL           | Barcelona       |
----------------------------------------------------------------------------------

结果 R2:我希望您帮助获得此结果:

ID_AUTHOR | AUTHOR_FirstName | AUTHOR_LastName | Street_Coord   | City_Name       |
----------------------------------------------------------------------------------
X         |James             | Conor           | 1245 rich st   | Madrid          |
----------------------------------------------------------------------------------
X         |James             | Conor           | 154 music st   | Barcelona       |
----------------------------------------------------------------------------------

非常感谢, 瓦卢德

4

2 回答 2

0

第一个想法是您真的想将这些表连接在一起。就像是:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       "Adresses"."Street_Coord", "Cities"."City_Name"
FROM "Author" join
     "Adresses"
     on Author.Author_id = Adresses.Author_id join
     Cities
     on Author.Author_id = Cities.Author_id 
WHERE "Author"."Author_ID"='X';

但是,这将返回值的笛卡尔积,即 4 行而不是 2 行。似乎目的是“对齐”不同的表格。在这种情况下,这个查询接近你想要的:

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName",
       "Adresses"."Street_Coord", "Cities"."City_Name"
FROM "Author" join
     (select a.*, rownum as seqnum from "Adresses" a
     ) Adresses
     on Author.Author_id = Adresses.Author_id join
     (select c.*, rownum as seqnum from Cities c
     ) Cities
     on Author.Author_id = Cities.Author_id and addresses.seqnum = cities.seqnum
WHERE "Author"."Author_ID"='X';

这种方法的主要问题是 SQL 表本质上是无序的。您需要一些列来对这些进行排序,以保证查询正常工作。例如,如果您在表中有一个自动递增的 id,那么每个子查询可以通过order by id.

于 2013-05-23T00:35:44.880 回答
0

你不想做一个 UNION,你想做一个 JOIN :

SELECT "Author"."Author_ID", "Author"."Author_FirstName", "Author.Author_LastName", "Adresses"."Street_Coord", "Cities"."City_Name"
 FROM "Author"
 INNER JOIN "Adresses" ON "Author"."Author_ID"="Adresses"."Author_ID"
 INNER JOIN "Cities" ON "Author"."Author_ID"="Cities"."Author_ID"
 WHERE "Author"."Author_ID"='X'

没测试,可能有错别字...

此外,您需要在“地址”和“城市”之间添加一个额外的连接列,以匹配“1245 Rich st”与“Madrid”和“154 music st”和“Barcelona”。类似“City_ID”的东西。然后将其添加到 INNER JOIN ... ON 子句中:

INNER JOIN "Cities" ON "Adresses"."City_ID"="Cities"."City_ID" AND "Author"."Author_ID"="Cities"."Author_ID"
于 2013-05-23T00:36:10.523 回答