我想按我制作的键值表的每一行过滤查询结果,其中的数据将是动态的并且来自用户界面。
我的表单具有关联的表单输入,这些表单具有关联的表单输入详细信息。
假设我的表单结果如下所示(其中“名称”和“年龄”是 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"},结果应该只显示表格 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。谢谢!
最佳答案
您可以使用聚合:
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
从一个或多个表中获取所有列。
关于sql - 按键值表中的多行过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971757/