SQL - Select 来自 child table 的 TOP 1 具有 WHERE 条件,2 个可能的值和 1 个是首选

SQL - Select TOP 1 from child table with WHERE condition, 2 possible values and 1 is preferred

我有 2 个 table、parent 和一个具有 1-N 关系的 child。

我想加入两个 table,但是 select 只有 PersonToCompany table 中的 1 条记录。我知道我可以使用例如CROSS APPLY,不过我也有一些条件。

我只想 select 特定的 PersonToCompany 记录,像这样:

WHERE (Email LIKE '%@abc.com%' OR Email LIKE '%xyz.com%')

现在是棘手的部分 - 有些人可以拥有 2 PersonToCompany 条记录,同时包含 @abc.com@xyz.com 电子邮件域。在这种情况下,我想确保带有 @abc.com 的记录将被 selected。我怎样才能做到这一点?

这是我的原始子查询 selects @abc.com OR @xyz.com没有偏好:

CROSS APPLY (
    SELECT TOP 1 
    PersonToCompany.Email AS Email
    FROM PersonToCompany 
    WHERE PersonToCompany.PersonId = Person.Id
    AND (PersonToCompany.Email LIKE '%@abc.com%') OR (PersonToCompany.Email LIKE '%@xyz.com%')
) PersonToCompany

TOP 1 没有 ORDER BY 是 "give me a row, I don't care which one"。所以简单的解决方法是添加一个 ORDER BY:

CROSS APPLY (
    SELECT TOP 1 
    PersonToCompany.Email AS Email
    FROM PersonToCompany 
    WHERE PersonToCompany.PersonId = Person.Id
    AND (PersonToCompany.Email LIKE '%@abc.com%' OR
         PersonToCompany.Email LIKE '%@xyz.com%')
    ORDER BY CASE WHEN PersonToCompany.Email LIKE '%@abc.com%' THEN 0 ELSE 1 END
) PersonToCompany

(我还移动了一些圆括号以使逻辑正确,我相信 - 你将单个谓词括起来,这实际上没有做任何事情。我已经将 OR 括起来,以便PersonId 无论找到哪个电子邮件地址都需要匹配,这对我来说更正确)