按键值表中的多行过滤结果

时间:2018-08-22 16:56:34

标签: sql sql-server

我想按我创建的键值表的每一行过滤查询结果,该表的数据将是动态的,并且来自用户界面。

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

说我的表单结果看起来像这样(其中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)。因此,如果他们通过过滤器{名称:“ Jason”,年龄:“ 19”},则结果应仅显示表格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

但是,这将返回满足两个过滤条件的结果,而不是同时满足所有条件(在我的示例中,它将返回Form 1和Form 3,而不仅仅是Form 1)。

有人知道我该如何解决吗?我不希望使用动态SQL,但是如果那是我可以使用的唯一选择。我正在使用SQL Server2014。谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用聚合:

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中添加更多列。或使用JOINEXISTSIN从一个或多个表中获取所有列。