首页 > 解决方案 > SQL Server SELECT 第一次出现或如果没有出现 SELECT 其他条件

问题描述

我在尝试为这里的工作形成正确的 SQL 查询时遇到问题。我有两张表,一张称为 CUSTOMER,另一张称为 CUSTOMER_CONTACT。为了简化这一点,我将只包括相关的列名。

CUSTOMER_ID是从 链接到CUSTOMER表的外键CUSTOMER_CONTACTCONTACT_VC只是他们联系信息的条目号。每个客户可能有多个CUSTOMER_CONTACT记录,但它们将有一个唯一的CONTACT_VC. EMAIL部分或全部也可以为空/空白。

我需要选择 /blank 所在的第一个条目CUSTOMER_CONTACT,但如果所有条目都没有电子邮件地址,则选择EMAILNOT NULLCUSTOMER_CONTACTCUSTOMER_CONTACT WHERE CONTACT_VC = 1

关于如何做到这一点的任何建议?

标签: sqlsql-serverforeign-keys

解决方案


以下方法使用 ROW_NUMBER 根据您在每个CUSTOMER_ID组中的排序逻辑检索一个数字,然后按检索到的第一条记录进行过滤。

您可以尝试以下方法:

SELECT 
    * 
FROM (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY CUSTOMER_ID
            ORDER BY (CASE WHEN EMAIL IS NOT NULL THEN 0 ELSE 1 END),CONTACT_VC 
        ) as rn
    FROM
        CUSTOMER_CONTACT
) t
WHERE rn=1

如果您想将此加入到客户表中,您可以使用上述查询作为子查询,例如

SELECT
   c.*,
   contact.*
FROM
   CUSTOMER c 
INNER JOIN (
    SELECT
        *,
        ROW_NUMBER() OVER (
            PARTITION BY CUSTOMER_ID
            ORDER BY (CASE WHEN EMAIL IS NOT NULL THEN 0 ELSE 1 END),CONTACT_VC 
        ) as rn
    FROM
        CUSTOMER_CONTACT
) contact ON c.ID = contact.CUSTOMER_ID and contact.rn=1

推荐阅读