Sql表需要帮助

时间:2013-07-13 19:22:45

标签: sql delphi crystal-reports

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

我遇到的问题是,只有在所有条件匹配且我不想要的情况下才会显示结果。如果数据库中没有条目,我希望该字段返回空白。

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

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

我可以在delphi和v studio中的数据源和主源中执行此操作,但是想要执行sql,因为另一个很容易很慢。

我的桌子是

  • 项目
  • 顺序
  • Calloff
  • Calltodeliverylink
  • 投放
  • Deliverytoinvoicelink
  • 发票

表格链接如下。

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

Order.projectid - project.id

Calloff.orderid - order.id

Callofftodeliverylink.deliveryid - call 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有一个条目。如果发票为空白,则不会显示任何内容。

1 个答案:

答案 0 :(得分:1)

连接语句中表的顺序是个问题。作为第一个表的发票是推动其余结果的表。

如果您需要与您的项目相关的所有订单,无论是否有任何发票,这里都是我要做的。请注意,您需要在Projects,Orders,Customers和Contacts中使用有效值,但其他所有值都可以为null。

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