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

标签 sql sql-server

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

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

假设我的表单结果如下所示(其中“名称”和“年龄”是 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 添加更多列。或者使用 JOINEXISTSIN 从一个或多个表中获取所有列。

关于sql - 按键值表中的多行过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971757/

相关文章:

sql - 如何修复 SQL Server Data Tools 中的 OLE DB 错误

c# - 如何在(rdlc)报告中水平显示表格

sql-server - ALTER VIEW 必须是批处理中唯一的语句

sql - 查询用 0 填充字段的左侧

MySQL查询 - 获取未购买单个产品ID所有部分的客户

sql - 使用变量时的查询性能

c# - 将焦点设置到 datagridview 中新插入或更新的一行?

php - 删除操作在 ajax 中不起作用

c# - 当连接丢失时,我将如何重新连接 Entity Frameworks 连接到数据库

sql-server - SQL Server 中嵌套事务的隔离范围是什么?