我们的最终用户可以通过多种方式将产品运送给我们的客户。他们可以使用一个表中的客户地址 ( [customer]
)、另一个表中的特定送货地址 ( [dropship]
) 或另一个表中的另一个送货地址(对于有多个地点的客户) ( [delivery]
)。这些都具有大致相同的结构,对于相同的数据点具有相同的列名(例如[address]
是所有表中的地址)。
目前,我们查找订单收货地址的逻辑如下:
SELECT
Address = COALESCE(r.address, d.address, c.address)
FROM [order] o
JOIN customer c
ON o.customerid = c.customerid
LEFT JOIN delivery d
ON o.customerid = d.customerid
AND o.delivaddressid = d.delivaddress
LEFT JOIN dropship r
ON o.orderid = r.orderid;
然而,这对我来说是一个新的范例,我正在努力思考它。我只是将LEFT JOIN
s替换为
WHERE EXISTS
(select 1 from delivery d
where o.customerid = d.customerid
and o.delivaddressid = d.delivaddress)
这将不允许我使用来自的数据,[delivery]
除非我将它扔到FROM
子句中并创建笛卡尔积,对吧?
虽然您可以使用它
EXISTS
来确定是否存在运输地址,但您不能使用它来判断实际地址是什么。EXISTS
不返回任何数据。为此,您需要加入。更好的设计可能会在这里得到很好的服务,例如
Addresses
具有类型的单个表。但据我了解,您的模型目前不灵活。