Sql server 如何将关联表ID与条件匹配

Sql server 如何将关联表ID与条件匹配,sql-server,tsql,Sql Server,Tsql,我有与之相关的线索和标签。我想取得线索,必须有两个标签(9,13)和任何其他 如果我在查询中使用,它将返回带有或条件的线索,如果使用,它将不返回 你知道如何做到这一点吗 SELECT distinct [Leads].Id AS LeadId, Tags.Id, Tags.Name FROM [Leads] INNER JOIN [AssociateTags] ON [Leads].[Id] = [AssociateTags].[EntityId] INNER JOIN [Tags] ON

我有与之相关的线索和标签。我想取得线索,必须有两个标签(9,13)和任何其他

如果我在查询中使用,它将返回带有或条件的线索,如果使用,它将不返回

你知道如何做到这一点吗

SELECT distinct [Leads].Id AS LeadId, Tags.Id, Tags.Name FROM [Leads]  
INNER JOIN [AssociateTags] ON [Leads].[Id] = [AssociateTags].[EntityId]
INNER JOIN [Tags] ON [AssociateTags].[TagId] = [Tags].[Id]
WHERE [Leads].[IsDeleted] = cast(0 as bit)  
AND leads.id= 17 and (tags.Id in (9, 13))
--AND leads.id= 17 and tags.Id = 9 and tags.Id = 13
样本输出

17  9   imported-from-google
17  13  imported-from-quickbooks
总记录

17  9   imported-from-google
17  13  imported-from-quickbooks
17  14  imported-from-yahoo

尝试使用已存在的。这将返回标记为9和17行的任何潜在客户的标记信息(和潜在客户ID)

SELECT distinct [Leads].Id AS LeadId, Tags.* 
FROM [Leads]  
INNER JOIN [AssociateTags] ON [Leads].[Id] = [AssociateTags].[EntityId]
INNER JOIN [Tags] ON [AssociateTags].[TagId] = [Tags].[Id]
WHERE [Leads].[IsDeleted] = cast(0 as bit)  
AND leads.id= 17 
AND EXISTS (Select 1 from [Tags] where [AssociateTags].[TagId] = [Tags].[Id] and [Tags].[ID] = 9)
AND EXISTS (Select 1 from [Tags] where [AssociateTags].[TagId] = [Tags].[Id] and [Tags].[ID] = 13)
如果您真的不需要标记信息,可以消除连接:

SELECT distinct [Leads].Id AS LeadId
FROM [Leads]  
INNER JOIN [AssociateTags] ON [Leads].[Id] = [AssociateTags].[EntityId]
WHERE [Leads].[IsDeleted] = cast(0 as bit)  
AND leads.id= 17 
AND EXISTS (Select 1 from [Tags] where [AssociateTags].[TagId] = [Tags].[Id] and [Tags].[ID] = 9)
AND EXISTS (Select 1 from [Tags] where [AssociateTags].[TagId] = [Tags].[Id] and [Tags].[ID] = 13)
试试这个:

DECLARE @T TABLE(ID INT, TAG_ID INT,Name  VARCHAR(100))

INSERT INTO @T VALUES
(17 , 9  ,' imported-from-google'),
(17 , 13,'  imported-from-quickbooks'),
(17 , 14,'  imported-from-yahoo')

SELECT * FROM @T WHERE (ID=17 AND TAG_ID=9) OR (ID=17 AND TAG_ID=13)

对于每个lead_id,查询必须首先统计(9,13)中包含tag_id的行。然后,可以在外部查询的WHERE子句中限制最终输出。下面是一个示例,其中包含示例数据,然后(尽可能不包含数据)应用于原始代码。像这样的

/* exmaple */
DECLARE @T TABLE(ID INT, TAG_ID INT,Name  VARCHAR(100))

INSERT INTO @T VALUES
(17 , 9  ,' imported-from-google'),
(17 , 13,'  imported-from-quickbooks'),
(17 , 14,'  imported-from-yahoo'),
(18 , 9  ,' imported-from-google'),
(18 , 23,'  imported-from-quickbooks'),
(18 , 14,'  imported-from-yahoo'),
(19 , 13,'  imported-from-quickbooks'),
(19 , 14,'  imported-from-yahoo');

with sum_tags_cte as (
    select *, sum(iif(TAG_ID in(9,13), 1, 0)) over (partition by ID order by (select null)) tags_count
    from @T)
select *
from sum_tags_cte
where tags_count=2;

/* applied to original code */
with sum_tags_cte(LeadId, Id, [Name], tags_count) as (
    SELECT [Leads].Id AS LeadId, Tags.Id, Tags.Name,
            sum(case when TAG_ID in(9,13) then 1 else 0 end) 
                over (partition by ID order by (select null))
    FROM [Leads]  
         JOIN [AssociateTags] ON [Leads].[Id] = [AssociateTags].[EntityId]
         JOIN [Tags] ON [AssociateTags].[TagId] = [Tags].[Id]
    WHERE [Leads].[IsDeleted] = cast(0 as bit))
select LeadId, Id, [Name]
where tags_count=2
      and Id in (9, 13) /* to only display 2 lines */
;

和tags.Id=9和tags.Id=13
这永远不会是真的。何时标量值可以是两个不同的值?中的
有什么问题?什么
条件?您的查询中没有一个。另外,当您有
标记时,为什么要使用
不同的
?您不太可能得到任何已经不唯一的行,因为我假设
标记
具有唯一的标识列。如果您在中使用,则它将返回带有任何一个标记的lead,但在我们的情况下,我们希望确保这两个标记都与lead关联。假设任何潜在客户都只有标签9,并且也会返回,尽管我们只希望同时拥有9和13样本数据的人和预期结果能够帮助我们。使用distinct通常表示作者不了解数据模型或编写了逻辑上有缺陷的查询(并且知道如何修复)。你的具体目标是什么?您想要两个标签都有的潜在客户吗?至少有一个标签的潜在客户?既有标签又有其他标签的潜在客户?每个产品只有一个标签的潜在客户?这些细节很重要——先想想。展示一些示例数据和预期结果,以帮助您和其他人理解您的目标,并请阅读一些关于改进问题的提示。您应该提供DDL,一个有用的样本输入和预期结果的集合。[Tags].[ID]=17是错误的,它是13。但它仍然不返回任何数据too@SOFUser它不会返回任何数据,因为不满足条件。您确定这些表包含您认为它们包含的所有记录吗?如果删除
和exists
子句,会发生什么情况?您将为与Lead 17关联的每个标记返回行。如果不存在,则可能是数据不存在,也可能是您不正确地加入了表。上述查询存在相同的问题,即使tag_13不存在,它也会返回结果“同时具有两个tag和任何其他tag的Lead?”请立即尝试@SOFUserSELECT*FROM@T WHERE(ID=17和tag_ID=9)或(ID=17和tag_ID=15)如果您传递不存在的id 15,它也会有同样的问题,但仍然会返回带有9的结果,因为其或conditionPlz会提供更多样本数据@SOFUser