问题描述
背景
我正在使用 4D 数据库 (v17.5) 并尝试查询记录。我有以下简化的架构:
Customers (table)
-CustomerID (field)
-CompanyName (field)
-City (field)
-State (field)
SalesOrders (table)
-CustomerID (field)
-OrderTotal (field)
它们通过多对一的自动关系联系在一起:
[Customers]CustomerID (O)<-------------------------(M) [SalesOrders]CustomerID
(ParentCustomer) (ChildSalesOrders)
我可以使用以下任一方法查询以获取一组 [SalesOrders] 记录:
ds.SalesOrders.query("OrderTotal > 500 AND ParentCustomer.State = 'New York'")
ds.Customers.query("State = 'New York' AND ChildSalesOrders.OrderTotal > 500").ChildSalesOrders
问题
有些客户根本没有订单,如果我想找到一组零相关订单的客户,我就遇到麻烦了。
我已经完成了以下工作:
$voCustomerstocheck:=ds.Customers.query("State = 'New York')
$voCustomersWithoutOrders:=ds.Customers.newSelection()
For each($voCustomer;$voCustomerstocheck)
If ( $voCustomer.ChildSalesOrders.length > 0 )
$voCustomersWithoutOrders.add($voCustomer)
End if
End for each
我想做的是:
$voCustomersWithoutOrders:=ds.Customers.query("State = 'New York' AND ChildSalesOrders.length = 0')
不过这行不通。
问题
我正在努力实现的目标可行吗?
解决方法
Classic 4D 可以做到这一点。我不确定 ORDA。这是一个例子;
CREATE EMPTY SET([Companies];"NoSales")
ALL RECORDS([Companies])
CREATE SET([Companies];"AllRecsSet")
ALL RECORDS([Invoices])
RELATE ONE SELECTION([Invoices];[Companies])
CREATE SET([Companies];"InvoiceSet")
DIFFERENCE("AllRecsSet";"InvoiceSet";"NoSales")
USE SET("NoSales")
CLEAR SET("InvoiceSet")
CLEAR SET("InvoiceSet")
CLEAR SET("NoSales")
,
在 ORDA 中,您可以使用 NULL 关键字;所以解决方案是写:
$voCustomersWithoutOrders:=ds.Customers.query("State = 'New York' AND ChildSalesOrders = NULL')