我想按我创建的键值表的每一行过滤查询结果,该表的数据将是动态的,并且来自用户界面。
我有具有关联的表单输入的表单,这些表单具有关联的表单输入详细信息。
说我的表单结果看起来像这样(其中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。谢谢!
答案 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
中添加更多列。或使用JOIN
,EXISTS
或IN
从一个或多个表中获取所有列。