sql - 左连接到可能包含或不包含数据的表
问题描述
我有以下表格:客户和商店。他们有以下列:
客户: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。
知道我的请求有什么问题吗?
解决方案
如果商店中没有数据,请使用内部联接而不是左联接并使用 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'
推荐阅读
- python-3.x - 如何按列计算唯一值
- python - 可以在没有互联网的情况下进行泡菜和套接字连接
- c++ - 了解 ABI C++
- c++ - 多维数组打印十六进制数字而不是数组的内容
- prestashop - 无法将主题上传到 Prestashop
- imagemagick - Imagemagick 用白色替换图像中的所有颜色
- scala - 将 Flink DataStream 写入 Iceberg 表:NoSuchMethodError: org.apache.parquet.schema.Types$PrimitiveBuilder.as
- r - 如何执行引导程序并在 R 中找到置信区间
- c++ - 使用 C++ unordered_map 的 Seg 错误
- c++ - c++交换全局和局部向量?