Sql 查询以排除结果

Sql 查询以排除结果,sql,Sql,我有以下要求,我不知道如何实现它。 假设我们有三个表:联系人、订阅和产品。 让我编辑信息并添加更多上下文 我们的结构如下: 用户购买订阅,订阅包含产品。 我们有两种类型的产品试用和每月一次。 用户可以购买试用产品,之后,他可以决定每月购买一个。 我们的营销团队希望得到所有试用订阅用户的结果(假设我们有5个人),但如果这5个人中的任何一个人购买了每月订阅,将其从结果中排除,因为我们不想向他发送促销电子邮件,因为他购买了许可证 以下是SQL当前的外观: select cs_subscription.

我有以下要求,我不知道如何实现它。 假设我们有三个表:联系人、订阅和产品。 让我编辑信息并添加更多上下文

我们的结构如下: 用户购买订阅,订阅包含产品。 我们有两种类型的产品试用和每月一次。 用户可以购买试用产品,之后,他可以决定每月购买一个。 我们的营销团队希望得到所有试用订阅用户的结果(假设我们有5个人),但如果这5个人中的任何一个人购买了每月订阅,将其从结果中排除,因为我们不想向他发送促销电子邮件,因为他购买了许可证

以下是SQL当前的外观:

select cs_subscription.cs_contactyominame as 'Contact Name',
product.name as 'Product Name',
cs_subscription.createdon as 'Created On',
cs_subscription.cs_expirationdate as 'Expiration Date',
case
when cs_subscription.cs_status=110000000 then 'Active'
end as 'Status'
from cs_subscription
join product on cs_subscription.cs_product=product.productid
where product.name='Trial'
and cs_status=110000000
and cs_contactyominame IS NOT NULL
and name IS NOT NULL
order by cs_expirationdate asc

结果中的一个用户——Mebi Fo也有每月的订阅,所以我们想从结果中删除它,这样他就不会收到任何试用电子邮件

第二个屏幕截图来自我们的内部系统,该系统存储每个用户的订阅详细信息


我希望我解释得足够好?我该如何做到这一点

假设您正在寻找订购yeallow t恤但不订购橙色t恤的联系人,您可以在中使用
,在
中使用
而在
中不使用

select contact.name
from contact
where contact.contactid in (
  select s.contact
  from subscriptions s
  join product p on s.product = p.productid
  where p.name = 'Yellow T-Shirt'
) and contact.contactid not in (
  select s.contact
  from subscriptions s
  join product p on s.product = p.productid
  where p.name = 'Orange T-Shirt'
)
该解决方案假设您在
订阅中从未有空值。请联系
,(即非空外键)


上面的查询将加入订阅的所有产品。然后按合同名称将其分组。因为您将nvarchar转换为int,并使用MIN和MAX获得单个值。因此,只会选择带有“黄色T恤”的产品。

添加一些示例表数据和预期结果-全部为格式化文本(而不是图像)。简化,可能是3人而不是10人。()你的数据库管理系统是什么?神谕MySQL?SQL Server。。。请使用有问题的DBMS标记您的请求。
选择contact.name
,联系人来自何处?在当前查询中,您显示的是产品。但是,当您正在寻找订阅了产品A而不是产品B的联系人时,您已经知道这是关于什么产品的,我想在结果中只显示没有产品的联系人就足够了?另一方面,单引号用于字符串文字,而不是名称。这是正确的:
where product.name='Yellow T-Shirt'
,而这不是:
product.name作为'product'
。名称的标准分隔符是双引号
”,但一些DBMS使用其他适当的分隔符。
CAST('Yellow T-Shirt'作为INT)
?应该会出现错误。我将
where product.name添加到('Yellow T-Shirt','Orange T-Shirt')
,以避免蓝白T恤、袜子和裤子出现问题。(如果有合适的索引,则加快查询速度。)
select
       contact.name
from contact
join subscriptions on subscriptions.contact = contactid
join product on subscriptions.product = product.productid
group by contact.name
having MAX(product.name) = 'Yellow T-Shirt'
       AND MIN(product.name) = 'Yellow T-Shirt'