我想以优化的方式连接两个相当大的表,并在这里寻找解决方案。
一张表有客户(以 ID 作为主键)。
这要加入:
地址表具有不同类型的地址数据 - 它还具有作为 pk 的 ID、作为外键但具有重复项的客户 ID、给定行的地址类型和地址本身。
我想实现选择顺序 - 如果客户存在最喜欢的地址类型(在本例中为邮政),则采用此地址类型,否则采用第二优先(在本例中为邮政)交付)是次佳类型,然后第三种类型(本地)是最不优选的。实际问题中可能有超过3个选项,可能有5-6个。
为了说明我的问题:
客户表:
地址表
所需的输出如下所示:
因此,对于客户 1 (Joe),选择了邮政类型地址,因为它确实存在。然后,对于客户 2 (Eva),选择“交付”类型作为第二佳选项,最后对于客户 3 (David),选择“位置”类型地址。没有为 Adam 选择地址。
我可以通过多个步骤找出一些选项,例如。多次加入地址表,然后使用 CASE WHEN 类型包装查询选择地址,但必须有一种更简单的方法来执行此操作。
这是一个 fiddle (MS SQL Server) http://sqlfiddle.com/#!18/e0ffce
提前致谢
最佳答案
使用 CTE
与 DENSE_RANK()
在您的Address
上 table 。要接听没有地址的客户,请添加 COALESCE
到WHERE
子句:
WITH CTE AS (
SELECT *, DENSE_RANK() OVER (PARTITION BY cust_id ORDER BY
CASE WHEN address_type = 'Postal' THEN 1
WHEN address_type = 'Delivery' THEN 2
WHEN address_type = 'Locational' THEN 3
ELSE NULL END ASC) AS dr
FROM Address)
SELECT a.*, b.address_type, b.address
FROM Customer a
LEFT JOIN CTE b
ON a.id = b.cust_id
WHERE COALESCE(dr, 1) = 1
结果:
<强> Demo在这里。
关于具有替代结果的表上的 SQL 左连接 - 实现选择顺序以获得最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74785657/