如何使用 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 检查不在两个表中的记录以获取另一个第三个表中的日期?