加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

用于搜索具有无限数量的位字段的表的SQL设计方法

发布时间:2021-04-01 13:49:58 所属栏目:编程 来源:网络整理
导读:考虑搜索包含公寓租赁信息的表:使用该界面的客户端选择在数据库中表示为位字段的多个条件,例如: AllowPets HasParking HasDeck ModernKitchen 等等.. 我们面临的情况是,我们软件的每个新客户都有他们希望允许最终用户搜索的其他字段.位字段的数量可以达到数

在上面的搜索查询中,我只是包含了要搜索的属性ID的CSV字符串.实际上,您可以创建一个搜索存储过程,在其中传入包含要搜索的ID的CSV参数.您可以查看this answer以了解可以将CSV字符串无循环拆分到可以加入的表中.这将导致不需要使用任何动态SQL.

编辑基于许多评论:

如果向#AttributeTypes表添加几列,则可以动态构建搜索页面.以下是一些建议:

>状态:“A”ctive“I”nactive
> ListOrder:可以使用它来排序以构建屏幕
> ColumnNumber:可以帮助组织同一屏幕行上的字段
> AttributeGroupID:分组字段,见下文
>等

您可以创建所有字段复选框,或添加另一个名为#AttributesGroups的表,并将其组合在一起并使用单选按钮.例如,由于“Pets Allowed”和“No Pets”是独占的,因此在#AttributesGroups表“Pets”中添加一行.应用程序将在界面中对属性进行分组.组中的属性与常规的未组合属性相同,只需收集选定的ID并将其传递给搜索过程.但是,对于每个组,您需要让应用程序包含“无首选项”单选按钮并将其默认打开.此选项没有属性ID,因为您不想考虑该属性,所以不会传入该选项.

在我的示例中,我确实展示了#Apartments中的“超级属性”的示例
表,“状态”.您应该只考虑此表的主要属性.如果您开始使用这些,您可能希望将CTE更改为FROM #Apartments并对这些字段进行过滤,然后加入#Attributes.但是你会遇到Dynamic Search Conditions,so read this article by Erland Sommarskog的问题.

编辑最新评论:

这里是代码,有一个排除属性列表:

;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,..)找到允许携带宠物的公寓
>(..,7,..)找到不允许携带宠物的公寓
>(..,..)如果没有偏好.

我认为这是更好的方法.当与上一次编辑中描述的分组构思和动态构建的搜索页面结合使用时,我认为这会更好并且运行得更快.

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读