【问题标题】:Returning filtered results from sql select从 sql select 返回过滤结果
【发布时间】:2021-02-23 08:04:19
【问题描述】:

对于上下文,这是一个可由最终用户调用的搜索,他们将提供逗号分隔的字符串,其中包含要搜索的表 3 ID 和要搜索的表 2 文本值。

我想执行一个选择查询,它只返回来自 CTE 的匹配结果,其中 fieldValuePairTable 中的所有值都匹配。目前它返回任何匹配项。

DECLARE @fieldvaluepairtable TABLE (Table3Id int, value varchar(max));
INSERT INTO @fieldvaluepairtable SELECT * FROM dbo.split_string_XML('123:york,456:halifax',',');

with cte as (
select Table1.id, Table3.id as t3id, Table2.text
from Table1
inner join Table2 on Table1.id = Table2.Table1Id
inner join Table3 on Table2.id = Table3.Table2Id)

select distinct id 
from cte
join @fieldvaluepairtable DataTable on (text like cast( '%' +  DataTable.value + '%' as varchar ) and t3id = DataTable.Table3Id)

例如;
CTE 的可能结果集如下所示:

id   t3id  text       
---- ----- --------------- 
100  123   york            
100  456   halifax     
200  123   york                
200  456   manchester            

select 语句然后会返回

id       
---- 
100
200

我想选择字段值对表中的所有值都匹配的 ID,而不是任何匹配的 ID。 意思是我想看到以下结果

id       
---- 
100

代码将在存储过程中使用,因此它需要能够处理传递到 fieldvaluepairtable 的任意数量的键值对

【问题讨论】:

  • 旁注,我真的建议用表格类型参数替换那个分隔的分隔(是的,我的意思是双倍)值。
  • 样本数据和期望的结果会让这一点更清楚。

标签: sql sql-server count ssms inner-join


【解决方案1】:

如果我没听错的话,你可以使用一些关系划分技术:

select t1.id
from table1 t1
inner join table2 t2 
    on  t1.id = t2.table1id
inner join table3 t3 
    on  t2.id = t3.table2id
inner join @fieldvaluepairtable x 
    on  t3.text like cast( '%' +  x.value + '%' as varchar ) 
    and t3.t3id = x.table3id
group by t1.id
having count(*) = (select count(*) from @fieldvaluepairtable)

基本上这会搜索匹配项,然后将结果按t1.id 分组,并确保组中的行数等于搜索条件的计数。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多