【问题标题】:JOIN 3 tables in Oracle在 Oracle 中加入 3 个表
【发布时间】:2018-02-24 16:23:07
【问题描述】:

我有 3 张桌子:

一般:

all_id |
000001
000002
000003
000004
000005

客户:

client_id | client_nmbr
000002    |  22222222
000003    |  33333333

公司:

company_id | company_nmbr
000001     |  11111111
000004     |  44444444
000005     |  55555555

我需要加入 3 个按 all_id 排序的表,并且只有一列包含 client_nmbr + company_nmbr,如下所示:

all_id | all_nmbr
000001 | 11111111
000002 | 22222222
000003 | 33333333
000004 | 44444444
000005 | 55555555

我尝试将 UNION 与表 Clients 和 Company 一起使用,以获得带有 client_nmbr + company_nmbr 的单列。它有效,但我不知道如何将它与 SELECT 一起使用,以按 all_id 对列进行排序,因为它在另一个表中。

这是我目前得到的:

   SELECT client_nmbr as all_nmbr
   FROM Clients
   UNION ALL 
   SELECT company_nmbr
   FROM Company

结果是:

all_nmbr|
22222222
33333333
11111111
44444444
55555555

我需要用 all_id 列加入该结果并按 all_id 排序所有内容

是否可以只用一个 SELECT 查询来做到这一点?有什么建议吗?

提前致谢

【问题讨论】:

  • 您写的 "只有一列包含 client_nmbr + company_nmbr",但随后显示的输出包含两列。输出应该是什么样子?
  • 如果每个 id 都出现在两个表(clients 和 company)中的一个中,为什么需要加入 FIRST 表?也许 FIRST 表还有其他包含附加信息的列?那么 - 第一个表中是否有在“客户”或“公司”中找不到的 ID - 如果是这样,你需要左连接吗?
  • @trincot 实际上我需要一个带有 all_id 的列和另一个带有 client_nmbr+company_nmbr 的列以及由 all_id 排序的这两列
  • @mathguy 就是这样。 General 表有更多信息,我也需要获取这些信息,但由于 clients_nmbr 和 company_nmbr 有问题,我认为这不太重要。 all_id 包含 company 和 client 中的每个 id。

标签: sql oracle join union


【解决方案1】:

只需将另一列添加为第一列,并按第一列排序:

SELECT client_id as all_id,
       client_nmbr as all_nmbr
FROM   Clients
UNION ALL 
SELECT company_id,
       company_nmbr
FROM   Company
ORDER BY 1

如果您不想在结果中添加列,则使用子查询:

SELECT all_nmbr
FROM   (
        SELECT client_id as all_id,
               client_nmbr as all_nmbr
        FROM   Clients
        UNION ALL 
        SELECT company_id,
               company_nmbr
        FROM   Company
       )
ORDER BY all_id

虽然第一个表 General 似乎一点用都没有(因为它可以从其他两个表派生),但您也可以使用该表,并将其他两个表外连接到它:

SELECT COALESCE(client_nmbr, company_nmbr) all_nmbr
FROM   General
LEFT JOIN Clients ON client_id = all_id
LEFT JOIN Companies ON company_id = all_id
ORDER BY all_id

【讨论】:

  • 实际上,第一个表(常规)还有一些其他列,我也需要选择这些列,但由于我只有这些列有问题,所以我认为添加这些信息并不重要。无论如何,你的回答解决了我的问题!非常感谢!
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2017-10-27
  • 2017-08-05
  • 2015-10-10
相关资源
最近更新 更多