首页 > 解决方案 > 按键值表中的多行过滤结果

问题描述

我想按我制作的键值表的每一行过滤我的查询结果,其中的数据将是动态的并且来自 UI。

我有具有关联表单输入的表单,这些表单具有关联的表单输入详细信息。

说我的表单结果看起来像这样(其中 Name 和 Age 是 FormDetail.FieldNames):

Form Name | Name   | Age
------------------------
Form 1    | Jason  | 19
------------------------
Form 2    | Martha | 25
------------------------
Form 3    | Jason  | 20
------------------------
Form 4    | Tim    | 30

用户应该能够通过多个组合过滤器过滤这些结果,其中他们通过的所有条件都需要通过(IE 不是 OR,它应该是 AND)。因此,如果他们通过过滤器 { Name : "Jason", Age : "19" },结果应该只显示 Form 1。

到目前为止,这是我的查询:

DECLARE @KeyValue Table (
 KeyString VARCHAR(MAX),
 ValueString VARCHaR(MAX)
)

INSERT INTO @KeyValue (KeyString, ValueString)
VALUES ('Name', 'Jason')
INSERT INTO @KeyValue (KeyString, ValueString)
VALUES ('Age', '20')

SELECT * FROM Form
INNER JOIN FormInput 
   ON Form.FormID = FormInput.FormID
INNER JOIN FormDetail 
   ON FormInput.FormDetailID = FormDetail.FormDetailID
INNER JOIN @KeyValue KeyValuePairFilter 
   on KeyValuePairFilter.KeyString = FormDetail.FieldName 
  AND KeyValuePairFilter.ValueString = FormInput.TextValue

但是,这是返回满足任一过滤条件的结果,而不是满足所有条件的结果(在我的示例中,它将返回表格 1 和表格 3,而不仅仅是表格 1)。

有谁知道我该如何解决这个问题?我宁愿不使用动态 SQL,但如果这是我可以使用的唯一选择。我正在使用 SQL Server 2014。谢谢!

标签: sqlsql-server

解决方案


您可以使用聚合:

SELECT f.FormID
FROM Form f JOIN
     FormInput fi
     ON f.FormID = fi.FormID JOIN
     FormDetail fd
     ON fi.FormDetailID = fd.FormDetailID JOIN
     @KeyValue kv 
     ON kv.KeyString = fd.FieldName AND
        kv.ValueString = fi.TextValue
GROUP BY f.FormID
HAVING COUNT(*) = (SELECT COUNT(*) FROM @KeyValue);

这个版本刚刚回归FormID。您可以在SELECT/中添加更多列GROUP BY。或使用JOIN, EXISTS, 或IN从一个或多个表中获取所有列。


推荐阅读