用于搜索具有无限数量的位字段的表的SQL设计方法
在上面的搜索查询中,我只是包含了要搜索的属性ID的CSV字符串.实际上,您可以创建一个搜索存储过程,在其中传入包含要搜索的ID的CSV参数.您可以查看this answer以了解可以将CSV字符串无循环拆分到可以加入的表中.这将导致不需要使用任何动态SQL. 编辑基于许多评论: 如果向#AttributeTypes表添加几列,则可以动态构建搜索页面.以下是一些建议: >状态:“A”ctive“I”nactive 您可以创建所有字段复选框,或添加另一个名为#AttributesGroups的表,并将其组合在一起并使用单选按钮.例如,由于“Pets Allowed”和“No Pets”是独占的,因此在#AttributesGroups表“Pets”中添加一行.应用程序将在界面中对属性进行分组.组中的属性与常规的未组合属性相同,只需收集选定的ID并将其传递给搜索过程.但是,对于每个组,您需要让应用程序包含“无首选项”单选按钮并将其默认打开.此选项没有属性ID,因为您不想考虑该属性,所以不会传入该选项. 在我的示例中,我确实展示了#Apartments中的“超级属性”的示例 编辑最新评论: 这里是代码,有一个排除属性列表: ;WITH GetMatchingAttributes AS ( SELECT ApartmentID,3) --<<change dynamically or split an include CSV string and join in GROUP BY ApartmentID HAVING COUNT(AttributeID)=3--<<change dynamically or split a CSV string and use COUNT(*) from resulting include table ),SomeRemoved AS ( SELECT m.ApartmentID FROM GetMatchingAttributes m LEFT OUTER JOIN #Attributes a ON m.ApartmentID=a.ApartmentID AND a.AttributeType IN (5,6) --<<change dynamically or split an exclude CSV string and join in WHERE a.ApartmentID IS NULL ) SELECT a.* FROM #Apartments a INNER JOIN SomeRemoved m ON a.ApartmentID=m.ApartmentID WHERE a.Status='A' 我不认为我会这样做.我会按照我之前编辑的方法进行操作.当需要包含/排除属性时,我只为每个属性添加一个属性:“允许携带宠物”和“禁止携带宠物”. 我更新了原始帖子中的示例数据以显示此信息. 运行原始查询: >(..,..,6,..)找到允许携带宠物的公寓 我认为这是更好的方法.当与上一次编辑中描述的分组构思和动态构建的搜索页面结合使用时,我认为这会更好并且运行得更快. (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |