1

我正在尝试构建一个 sql 查询,该查询适用于具有 2 个表的前一个查询,并且非常简单。不过,这个已经让我发疯了 6 个小时。

我遇到的问题是,只有在所有条件都匹配时才会显示结果,而我不希望这样。如果数据库中没有条目,我希望该字段返回空白。

我有一张桌子,我想显示 orderrefno。此时我想检查是否已创建交货单,如果已创建,我想查看是否已创建发票。然后用每个的数字报告给报告,但如果它们不存在,则。它应该只有订单号,其他都是空白的,或者只有发票是空白的,如果完成了交货单。

我尝试使用内部、左连接、右连接、完整在水晶中构建查询,但如果发票不存在,我希望它列出交货编号和订单编号,但它不会。

我可以在 delphi 和 v studio 的数据源和主源中执行此操作,但我想做一个 sql,因为另一个简单的方法很慢。

我的桌子是

  • 项目
  • 命令
  • 取消
  • Calltodeliverylink
  • 送货
  • Deliverytoinvoicelink
  • 发票

表链接如下。

Project.id 是主要的入口点。然后

Order.projectid -- project.id

Calloff.orderid -- order.id

Callofftodeliverylink.deliveryid -- 调用off.id

Delivery.id -- callofftodeliverylink.deliveryid

Deliverytoinvoicelink.deliveryid --delivery.id

Invoice.id --deliverytoinvoicelink.invoiceid

非常感谢

编辑:

添加代码。抱歉,FROM 部分一团糟。在水晶中绘制了链接字段并要求它向我展示查询,这就是它给我的。

SELECT 

 "Projects"."ID", "Orders"."IntOrderNo", "Deliveries"."DeliveryNo", "Projects"."InternalRef",    
 "CallOffs"."ID", "Customers"."Name", "Contacts"."Name", "Invoices"."InvoiceNo"


 FROM   

{oj (((((("GNManager"."dbo"."Invoices" "Invoices" LEFT OUTER JOIN "GNManager"."dbo"."DeliveryToInvoiceLink" "DeliveryToInvoiceLink" ON "Invoices"."ID"="DeliveryToInvoiceLink"."InvoiceID") LEFT OUTER JOIN "GNManager"."dbo"."Deliveries" "Deliveries" ON "DeliveryToInvoiceLink"."DeliveryID"="Deliveries"."ID") LEFT OUTER JOIN "GNManager"."dbo"."CallOffToDeliveryLink" "CallOffToDeliveryLink" ON "Deliveries"."ID"="CallOffToDeliveryLink"."DeliveryID") LEFT OUTER JOIN "GNManager"."dbo"."CallOffs" "CallOffs" ON "CallOffToDeliveryLink"."CallOffID"="CallOffs"."ID") LEFT OUTER JOIN ("GNManager"."dbo"."Projects" "Projects" LEFT OUTER JOIN "GNManager"."dbo"."Orders" "Orders" ON "Projects"."ID"="Orders"."ProjectID") ON "CallOffs"."OrderID"="Orders"."ID") INNER JOIN "GNManager"."dbo"."Customers" "Customers" ON "Orders"."CustomerID"="Customers"."ID") INNER JOIN "GNManager"."dbo"."Contacts" "Contacts" ON "Orders"."ContactID"="Contacts"."ID"}


 WHERE  

 "Projects"."InternalRef"='12/4169'

 ORDER BY 

 "Projects"."InternalRef" DESC, "Orders"."IntOrderNo" DESC

上面的语句确实有效并产生了我需要的一切,但前提是 Invoices 有一个条目。如果发票为空白,则不会显示任何内容。

4

1 回答 1

1

连接语句中表的顺序是问题所在。发票是第一个表格,它将推动其余结果。

如果您需要与您的项目相关的所有订单,无论是否有任何发票,我都会这样做。请注意,您需要项目、订单、客户和联系人中的有效值,但其他所有内容都可以为空。

select
    Projects.ID
    ,Orders.IntOrderNo
    ,Deliveries.DeliveryNo
    ,Projects.InternalRef
    ,CallOffs.ID
    ,Customers.Name
    ,Contacts.Name
    ,Invoices.InvoiceNo
from 
    Projects 
    join Orders on Orders.ProjectID = Projects.ID
    join Customers on Orders.CustomerID = Customers.ID
    join Contacts on Orders.ContactID = Contacts.ID
    left join Callofs on Callofs.OrderID = Orders.ID
    left join CallOffToDeliveryLink on CallOffToDeliveryLink.CallOffID = Callofs.ID
    left join Deliveries on CallOffToDeliveryLink.DeliveryID = Deliveries.ID 
    left join DeliveryToInvoiceLink on DeliveryToInvoiceLink.DeliveryID = Deliveries.ID
    left join Invoices on DeliveryToInvoiceLink.InvoiceID = Invoices.ID
where
    Projects.InternalRef = '12/4169'
order by
    Projects.InternalRef desc
    ,Orders.IntOrderNo desc
于 2013-07-13T21:05:42.483 回答