我遇到一个问题,让这个SQL脚本将两个表连接在一起,我可以执行它,它会显示第一部分的结果(AccountID,AuditDate ..etc),但它不会加入内部选择声明。
我通过抽查验证了数据库中存在匹配的数据。
我搞砸了哪一部分?
Select AccountID, AuditDate, SourceVersion
From Audit
Left join (
Select A.PrinterAuditID, A.AuditID, A.SerialNr, A.PageCountTotal,a.PageCountColor, A.PageCountMono
from InvalidPrinterAudit A
where A.DeviceID = 90757
) InvalidPrinterAudit on InvalidPrinterAudit.AuditID = Audit.AuditID
答案 0 :(得分:2)
这里发生了一些事情。
一个:为了在结果集中包含字段,它们必须包含在查询的SELECT
部分中:
Select AccountID, AuditDate, SourceVersion, InvalidPrinterAudit.PrinterAuditID, InvalidPrinterAudit.AuditID, InvalidPrinterAudit.SerialNr, InvalidPrinterAudit.PageCountTotal,InvalidPrinterAudit.PageCountColor, InvalidPrinterAudit.PageCountMono
From Audit
Left join (
Select A.PrinterAuditID, A.AuditID, A.SerialNr, A.PageCountTotal,a.PageCountColor, A.PageCountMono
from InvalidPrinterAudit A
where A.DeviceID = 90757
) InvalidPrinterAudit on InvalidPrinterAudit.AuditID = Audit.AuditID
两个:您不需要在此处拥有子查询。如果你需要从一个单独的表或其他东西聚合结果,子查询是很好的,但在这里你可以使用LEFT OUTER JOIN并完成它。
Select AccountID, AuditDate, SourceVersion, InvalidPrinterAudit.PrinterAuditID, InvalidPrinterAudit.AuditID, InvalidPrinterAudit.SerialNr, InvalidPrinterAudit.PageCountTotal,InvalidPrinterAudit.PageCountColor, InvalidPrinterAudit.PageCountMono
From Audit
Left OUTER JOIN InvalidPrinterAudit
ON InvalidPrinterAudit.AuditID = Audit.AuditID
AND InvalidPrinterAudit.DeviceID = 90757
这将在应用加入之前将DeviceID = 90757
过滤器应用于您的InvalidPrinterAudit
,这样您仍然可以获取所有Audit
条记录,然后只获取InvalidPrinterAudit
匹配的DeviceID的记录。
答案 1 :(得分:0)
您在外部查询中选择的内容少于内部查询中的列。
如果希望在结果集中返回它们,请将它们包含在外部:
Select AccountID, AuditDate, SourceVersion, PrinterAuditID, SerialNr
From Audit
Left join (
Select A.PrinterAuditID, A.AuditID, A.SerialNr, A.PageCountTotal,a.PageCountColor, A.PageCountMono
from InvalidPrinterAudit A
where A.DeviceID = 90757
) InvalidPrinterAudit on InvalidPrinterAudit.AuditID = Audit.AuditID