具有替代结果的表上的 SQL 左连接 - 实现选择顺序以获得最佳性能

标签 sql sql-server join

我想以优化的方式连接两个相当大的表,并在这里寻找解决方案。

一张表有客户(以 ID 作为主键)。

这要加入:

地址表具有不同类型的地址数据 - 它还具有作为 pk 的 ID、作为外键但具有重复项的客户 ID、给定行的地址类型和地址本身。

我想实现选择顺序 - 如果客户存在最喜欢的地址类型(在本例中为邮政),则采用此地址类型,否则采用第二优先(在本例中为邮政)交付)是次佳类型,然后第三种类型(本地)是最不优选的。实际问题中可能有超过3个选项,可能有5-6个。

为了说明我的问题:

客户表:

<表类=“s-表”> <标题> id 姓名 数据 <正文> 1 乔 一些数据乔 2 伊娃 一些数据伊娃 3 大卫 一些数据大卫 4 亚当 亚当的一些数据

地址表

<表类=“s-表”> <标题> id cust_id 地址类型 地址 <正文> 1 1 邮政 乔的邮政地址 2 1 交货 乔的送货类型地址 3 1 位置 Joe 的位置类型地址 4 2 交货 Eva 的递送类型地址 5 2 位置 Eva 的位置类型地址 6 3 位置 大卫的位置类型地址

所需的输出如下所示:

<表类=“s-表”> <标题> id 姓名 数据 地址类型 地址 <正文> 1 乔 一些数据乔 邮政 乔的邮政类型地址 2 伊娃 一些数据伊娃 交货 Eva 的递送类型地址 3 大卫 一些数据大卫 位置 大卫的位置类型地址 4 亚当 亚当的一些数据

因此,对于客户 1 (Joe),选择了邮政类型地址,因为它确实存在。然后,对于客户 2 (Eva),选择“交付”类型作为第二佳选项,最后对于客户 3 (David),选择“位置”类型地址。没有为 Adam 选择地址。

我可以通过多个步骤找出一些选项,例如。多次加入地址表,然后使用 CASE WHEN 类型包装查询选择地址,但必须有一种更简单的方法来执行此操作。

这是一个 fiddle (MS SQL Server) http://sqlfiddle.com/#!18/e0ffce

提前致谢

最佳答案

使用 CTEDENSE_RANK()在您的Address上 table 。要接听没有地址的客户,请添加 COALESCEWHERE子句:

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

结果:

<表类=“s-表”> <标题> id 姓名 一些_数据 地址类型 地址 <正文> 1 乔 一些数据乔 邮政 乔的邮政地址 2 伊娃 一些数据伊娃 交货 Eva 的递送类型地址 3 大卫 一些数据大卫 位置 大卫的位置类型地址 4 亚当 亚当的一些数据 空 空

<强> Demo在这里。

关于具有替代结果的表上的 SQL 左连接 - 实现选择顺序以获得最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74785657/

相关文章:

.net - 从 VB.NET 应用程序将文件发送到 PHP 脚本

sql - 测试范围内的值

sql - 在 Postgres 中将数字四舍五入到最接近的 10

javascript - 如何显示从数据库中检索到的多行文本

sql - WHERE ((SELECT COUNT(*) ...) = 0 OR EXISTS (SELECT * FROM ...)) 怎么办?

sql - 使用子查询比较两个表?

sql - 元组版本控制和复合主键

sql-server - 在 MS Reporting Services (SQL Server 2008) 中针对 ODBC 数据源使用参数

sql - 在 postgres 中加入性能

python - Pandas 使用 dfA 列合并 == dfB 索引