swa*_*eck 6 sql-server-2008-r2
我们的最终用户可以通过多种方式将产品运送给我们的客户。他们可以使用一个表中的客户地址 ( [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;
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说是一个新的范式,我正试图将我的大脑围绕在它周围。我是否只是将LEFT JOINs替换为
WHERE EXISTS
(select 1 from delivery d
where o.customerid = d.customerid
and o.delivaddressid = d.delivaddress)
Run Code Online (Sandbox Code Playgroud)
这将不允许我使用数据,[delivery]除非我将它扔到FROM子句中并创建笛卡尔积,对吧?
虽然您可以使用它EXISTS来确定是否存在 dropship 地址,但您不能使用它来判断实际地址是什么。EXISTS不返回任何数据。为此,您需要加入。
一个更好的设计可能在这里得到很好的服务,例如一个Addresses带有类型的单个表。但据我了解,您的模型目前不灵活。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |