sql - 按键值表中的多行过滤结果
问题描述
我想按我制作的键值表的每一行过滤我的查询结果,其中的数据将是动态的并且来自 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。谢谢!
解决方案
您可以使用聚合:
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
从一个或多个表中获取所有列。
推荐阅读
- java - 单元测试时如何使用测试资源文件夹中的数据
- dart - Firestore query based in subcollection attribute
- python - 从字符前后的数据列(字符串)中提取元素
- python - python 正则表达式的 \b 表示法?
- dataweave - $在dataweave中有什么用?
- android - 复制现有片段
- php - 无法使用 laravel-scout-tntsearch-driver 进行搜索
- jekyll - Jekyll - 可以循环浏览所有帖子类型吗?
- angular - 在 Ionic 项目中找不到模块“src/environments/environment”
- javascript - 使用 ajax 和服务器将图像加载到 SPA 时获取 net::ERR_CONNECTION_REFUSED