0

我已经在 Google 和 Stack Overflow 上搜索了我的查询的答案,但我觉得我缺乏 SQL 词汇正在阻碍我找到答案,因为我相信这将是一个常见问题。任何对我需要阅读的内容有帮助的观点总是受欢迎的。

关于这个问题,我试图在 Oracle 8i 中加入三个表,例如,公司表、发票表和工作表,发票表和工作表之间没有链接。我希望在一个查询中,我可以链接返回所有发票和公司所有工作的所有三个表,而无需返回每张发票的所有工作(请参阅下面的示例结果)。

我想看看:

Company 1   Invoice 1   Job 1
Company 1   Invoice 2   Job 2
Company 1   Invoice 3   Job 3

我不想看到:

Company 1   Invoice 1   Job 1
Company 1   Invoice 1   Job 2
Company 1   Invoice 1   Job 3
Company 1   Invoice 2   Job 1
Company 1   Invoice 2   Job 2
Company 1   Invoice 2   Job 3
Company 1   Invoice 3   Job 1
Company 1   Invoice 3   Job 2
Company 1   Invoice 3   Job 3

一如既往地感谢您提供的任何帮助。

编辑:

本质上,Invoice 和 Job Tables 都有一个 Company Table Key 字段,只是 Job 和 Invoice 表之间没有直接的链接。如果在有 2 个发票和 3 个工作时出现实例,我希望它显示,反之亦然:

Company 1   Invoice 1   Job 1
Company 1   Invoice 2   Job 2
Company 1               Job 3

尽管像这样看待问题让我觉得这比我希望的更容易得到答案。

4

1 回答 1

1

您的要求意味着您的架构有问题。在这种情况下,我的第一个建议是修改您的架构:添加job_idtoinvoice或 an invoice_idto job(或 NN 关系表invoice_job)。

如果您不愿意更新您的架构,您可以使用一个查询来进行连接。下面的查询基本上是joinjobinvoice一对一的:

SELECT c.company_id, ij.job_id, ij.invoice_id
  FROM company c
  LEFT JOIN (SELECT job_id, invoice_id, 
                    NVL(j.company_id, i.company_id) company_id
               FROM (SELECT j.job_id, j.company_id,
                            row_number() OVER (PARTITION BY company_id
                                           ORDER BY job_id) job_no
                       FROM job j) j
               FULL OUTER JOIN 
                    (SELECT i.invoice_id, i.company_id,
                            row_number() OVER (PARTITION BY company_id
                                           ORDER BY invoice_id) invoice_no
                       FROM invoice i) i
                    ON j.company_id = i.company_id
                   AND j.job_no = i.invoice_no) ij
              ON c.company_id = ij.company_id

这里的连接条件是人为的。如果您删除发票,作业和发票的关系可能会发生变化。

如果这两个表真的不相关,您可能希望以不同的方式显示结果,例如

SQL> SELECT cj.company_id, cj.jobs,
  2         listagg(i.invoice_id, ',')
  3            WITHIN GROUP (ORDER BY i.invoice_id) invoices
  4    FROM (SELECT c.company_id,
  5                 listagg(j.job_id, ',') WITHIN GROUP (ORDER BY job_id) jobs
  6            FROM company c LEFT JOIN job j ON c.company_id = j.company_id
  7           GROUP BY c.company_id) cj
  8    LEFT JOIN invoice i ON cj.company_id = i.company_id
  9  GROUP BY cj.company_id, cj.jobs;

COMPANY_ID  JOBS   INVOICES
----------- ------ --------
1           1,2,3  1,2
于 2012-10-03T09:48:54.407 回答