【问题标题】:Is there a better way to write this SQL query in sybase?有没有更好的方法在 sybase 中编写这个 SQL 查询?
【发布时间】:2020-09-04 03:52:46
【问题描述】:

我有一个带有以下查询的存储过程。基于@range 参数,我向 where 子句添加了更多条件。下面的查询给了我正确的结果。我想知道随着范围的增加,是否可以避免重复以前的“Idx”、“IdxType”。有没有更好的方法来编写这个查询?

 SELECT TOP 1 *
    FROM 
        MyTable
    WHERE
    ID1 = @Id1
    and Id1Type = @Id1Type
    and 
    (
        (@range = 2 and ID2 = @Id2 and ID2Type = @Id2Type)
         or
        (@range = 3 and ID2 = @Id2 and ID2Type = @Id2Type 
            and ID3 = @Id3 and ID3Type = @Id3Type)
        or
        (@range = 4 and ID2 = Id2 and ID2Type = @Id2Type 
          and ID3 = @Id3 and ID3Type = @Id3Type
          and ID4 = @Id4 and ID4Type = @Id4Type)
        or
        (@range = 5 and ID2 = @Id2 and ID2Type = @Id2Type 
          and ID3 = @Id3 and ID3Type = @Id3Type
          and ID4 = @Id4 and ID4Type = @Id4Type
           and ID5 = @Id5 and ID5Type = @Id5Type)
    )

【问题讨论】:

  • 说实话,当您决定存储单独的ID1、ID2 等列时,您已经转向了错误的方向。关系数据库是为不同的数据结构设计的

标签: sql sybase


【解决方案1】:

您可以做的是至少使用简单的布尔逻辑重新组合术语

SELECT TOP 1 *
  FROM 
    MyTable
  WHERE
    ID1 = @Id1 and Id1Type = @Id1Type and
    (@range < 2 or ID2 = @Id2 and ID2Type = @Id2Type) and 
    (@range < 3 or ID3 = @Id3 and ID3Type = @Id3Type) and
    (@range < 4 or ID4 = @Id4 and ID4Type = @Id4Type) and
    (@range < 5 or ID5 = @Id5 and ID5Type = @Id5Type) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多