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。
Person
: ID (INT), 名称 (VARCHAR)
PersonToCompany
: Id (INT), PersonId (INT), Email (Varchar)
我想加入两个 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
无论找到哪个电子邮件地址都需要匹配,这对我来说更正确)
我有 2 个 table、parent 和一个具有 1-N 关系的 child。
Person
: ID (INT), 名称 (VARCHAR)PersonToCompany
: Id (INT), PersonId (INT), Email (Varchar)
我想加入两个 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
无论找到哪个电子邮件地址都需要匹配,这对我来说更正确)