【问题标题】:display a specific row at the end in sql query在 sql 查询的末尾显示特定行
【发布时间】:2021-12-13 04:09:34
【问题描述】:

我有一个名为“ProductName”的表,它有几个类别,例如“Men”、“Women”、“Other”,每个类别都有子类别。

表格截图

后面的代码将显示所有类别如果ParentId 为Null 并显示基于每个类别parentId 降级到类别的所有子类别。 我添加了一个新类别 "Kids",但我想在查询末尾显示 "Other",Now Kids 将显示为最后一个。 如果有人可以帮助我,我将不胜感激。谢谢

查询:

select
    bn.[ProductId],
    bn.[Name],
    bn.[Store],
    bn.[City],
    bn.[ZipCode],
    bn.[ParentId]
from
    [dbo].[ProductName] bn
order by
        case 
        when bn.ParentID is null
        then bn.ProductId 
        else    (
                select  ProductId 
                from    ProductName parent 
                where   parent.ProductId = bn.ParentID
                ) 
        end,
        case when bn.ParentID is null then 1 end desc,
        bn.ParentID

【问题讨论】:

  • 抱歉,没有答案。老实说,这很简单,只是在尖叫糟糕的数据库设计。将您的类别和子类别设置为适当的相关实体会使这变得非常容易。在您的类别实体中,您甚至可以有一个专门用于排序查询结果的优先级属性
  • 这不能同时是 MySql 和 Sql Server。它是什么数据库?

标签: mysql sql sql-server database vb.net


【解决方案1】:

除了数据库设计,我建议对查询进行两处更改。

首先加入父母(可能是自己):

join dbo.ProductName parent on parent.ProductId = COALESCE(bn.parentId, bn.ProductID)

然后调整顺序以包含“其他”的特殊情况:

order by
    case when parent.name = 'Other' then 1 else 0 end,
    ...

【讨论】:

  • 我不同意搁置数据库设计。把它放在它所属的位桶中,然后重新开始。这张桌子只会是麻烦。
  • @Mary - 我明白了。在关系数据库中正确设计递归层次结构并维护正确规范化的形式并非易事。 OP 会很好地搜索和研究有关数据库设计和规范化的文章。我的意图不是消除设计缺陷,而是在当前设计的范围内回答具体的操作方法问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2014-01-06
  • 1970-01-01
  • 2011-03-26
  • 2019-05-05
  • 1970-01-01
  • 2012-08-26
  • 2015-05-13
相关资源
最近更新 更多