首页 > 解决方案 > 左连接到可能包含或不包含数据的表

问题描述

我有以下表格:客户和商店。他们有以下列:

客户:ID,姓名,姓氏,电子邮件

商店:ID、名称、ClientId

ClientId 是表 Client 的外键。

我需要根据姓名和姓氏或电子邮件进行搜索,如果 Shop 表中有任何条目,则返回它,但不应返回作为参数传递的 Id。

我尝试使用如下左连接,但这不起作用:

select *
from Client c 
left join Shop s
on c.Id  = s.ClientId
where c.Name = 'abc'
and c.Surname = 'xyx'
and c.Id != Id
or c.Email = 'ab@cde.com'
and c.Id != Id

但这并没有返回正确的数据。

例如,我想使用电子邮件 jon@samy.com 和 clientId = 201 搜索姓名 Jon 和姓 Sam。
因此,请求应该返回我所有具有姓名 Jon 和姓 Sam 或电子邮件 jon@samy.com 的客户,如果表 Shop return it 但不包括 ID 为 201 的客户。

我还想将此 SQL 转换为 LinQ。

知道我的请求有什么问题吗?

标签: sqlsql-serverlinq

解决方案


如果商店中没有数据,请使用内部联接而不是左联接并使用 or条件并根据需要从客户端添加数据

    select c.*
    from Client c 
    inner join Shop s
    on c.Id  = s.ClientId
    where c.Name = 'abc'
    or c.Surname = 'xyx'
    or c.Email = 'ab@cde.com'
   union
   select * from Client c
   where c.Name = 'abc'
    or c.Surname = 'xyx'
    or c.Email = 'ab@cde.com'

推荐阅读