EXISTS 与 LEFT JOIN 的实际应用以查找送货地址

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)

基于对话而不是一些博客文章EXISTS似乎是首选。

然而,这对我来说是一个新的范式,我正试图将我的大脑围绕在它周围。我是否只是将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子句中并创建笛卡尔积,对吧?

Aar*_*and 5

虽然您可以使用它EXISTS来确定是否存在 dropship 地址,但您不能使用它来判断实际地址是什么。EXISTS不返回任何数据。为此,您需要加入。

一个更好的设计可能在这里得到很好的服务,例如一个Addresses带有类型的单个表。但据我了解,您的模型目前不灵活。