如何使用 SQL 选择的结果来获取另一个表中的记录?

Posted

技术标签:

【中文标题】如何使用 SQL 选择的结果来获取另一个表中的记录?【英文标题】:How to use a result from a SQL select to get records in another table? 【发布时间】:2021-05-27 18:56:42 【问题描述】:

我很难创建一个从三个表中提取数据的 Sql。

下面是每个表的部分结构:

Customer table:
accnum   integer
name     string
address  string
Routeno  string
delno    integer

Invoice table:
accnum   integer
invnum   string
deldate  date
amount   float
routeno  string
vstatus  string

Card table:
accnum    integer
expdate   string

我需要的结果是路线 1、2 和 3 上的所有客户,然后我需要任何具有交货日期 (deldate) 和任何已存档信用卡的到期日期的发票。按delno排序。

Select c.accnum, c.name, c.address, c.routeno, c.delno from customer c
where c.routeno in ('1','2','3')

根据这个结果,我需要以下内容。

Select i.invnum, i amount from invoice i
where i.deldate = '2020-05-27' and (vstatus <> 'V' or vstatus is null)
and i.accnum=c.accnum
and i.routeno in ('1','2','3')

Select e.expdate from Card
where e.accnum=c.accnum

我尝试使用 Join,但后来我只得到了有发票的客户。

Select c.accnum, c.name, c.address, c.routeno, i.invnum, i.amount,  e.expdate from Customer c
left Join Card e on c.accnum=e.accnum 
left Join Invoice i on c.accnum=i.accnum
where i.deldate = '2020-05-27' and (vstatus <> 'V' or vstatus is null)
and i.accnum=c.accnum
and i.routeno in ('1','2','3')
order by c.routeno, c.delno

我需要这样的结果:

accnum name      address    routeno  delno invnum amount expdate
000030 Smith     1 main st   1         1   A123    5.00   12/22
000030 Smith     1 main st   1         1   A125    8.00   12/22
000022 Knox      14 main st  1         2   A124    10.00   
000014 Vohs      20 main st  1         3   A119    4.00   11/21
000078 Bow       3 Camp Ave  1         4   A120    3.00
000015 Jordan    4 River rd  2         1   A118    11.00  10/23
000015 Jordan    4 River rd  2         1   A117    15.00  10/23

感谢您的帮助。 凯赫杰

【问题讨论】:

这能回答你的问题吗? Left Outer Join doesn't return all rows from my left table? 这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息以及您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定名称/字符串/数字、“site:***.com”和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask、Help center 和投票箭头鼠标悬停文本。请在代码问题中提供minimal reproducible example。 这对我没有任何帮助。 这篇文章是重复的,该链接告诉您您在提供的代码中存在的误解以及为什么您缺少空值。它没有准确说明如何更改您的代码,但您没有明确说明您希望查询返回什么。 (包括你在散文和代码中试图说的“从这个结果中我需要以下内容”。)当你得到你不期望的结果时,将代码砍到返回你不期望的第一个子表达式 &提供minimal reproducible example,包括您的期望和原因,并提供参考权威文档的理由。祝你好运。 【参考方案1】:

提供的链接philipxy 应该为您指明正确的方向。 另一种方法是使用发票上所需的过滤条件创建一个外部连接子查询。

  SELECT c.accnum,
         c.name,
         c.address,
         c.routeno,
         i.invnum,
         i.amount,
         e.expdate
    FROM Customer c
         LEFT JOIN Card e ON c.accnum = e.accnum
         LEFT JOIN
         (SELECT accnum, invnum, amount
            FROM Invoice
           WHERE     deldate = '2020-05-27'
                 AND (vstatus <> 'V' OR vstatus IS NULL)
                 AND routeno IN ('1', '2', '3')) i
             ON i.accnum = c.accnum
ORDER BY c.routeno, c.delno

【讨论】:

感谢您的帮助,但我已经尝试过了,我收到了 SQL 错误,其中 Column not found on i.invnum 和 i.amount 如果我删除它,我会得到所有客户,因为有没有地方只能获取属于routeno 1,2,3的客户 对不起,我的错,我没有看到您在 Join Select 语句中有相同的列,谢谢。那是我一直想念的,当你看同一个问题八小时时会发生什么。再次感谢。 我发现 Left Join Card 必须在最后才能订购,否则我只会得到有卡在案的客户。

以上是关于如何使用 SQL 选择的结果来获取另一个表中的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DB2 sql 检查不在两个表中的记录以获取另一个第三个表中的日期?

如何 SQL 为另一个表中的每个 id 插入一条记录? [复制]

如何将存储过程的结果返回到用于插入记录的选择语句

如何在子查询中使用外部查询中的列从另一个表中获取结果?

如何获取一个MySql表中存在的记录而不是另一个[重复]

SQL - 如何从一个表中获取重复记录并连接到另一张表