【问题标题】:select statement where clause two conditionsselect语句where子句两个条件
【发布时间】:2012-01-26 11:12:36
【问题描述】:

最后我的 select 语句有问题。我想要做的是选择两个级别,但我没有得到这个声明的结果。请注意,如果@Level 为 1,我不想小于 1,否则可能会弄乱结果,因此也可能存在条件

@Level = @Level -1 我遇到问题的部分

FROM c WHERE c.Level = @Level AND c.Level = @Level - 1 ORDER BY Level ASC

或者这个

FROM c WHERE c.Level BETWEEN @Level AND c.Level - 1 ORDER BY Level ASC

SQL

DECLARE @Department TABLE
(
Id INT NOT NULL,
Name varchar(50) NOT NULL,
ParentId int NULL
)

INSERT INTO @Department SELECT 1, 'Toys', null
INSERT INTO @Department SELECT 2, 'Computers', null,  
INSERT INTO @Department SELECT 3, 'Consoles', 2
INSERT INTO @Department SELECT 4, 'PlayStation 3', 3
INSERT INTO @Department SELECT 5, 'Xbox 360', 2
INSERT INTO @Department SELECT 6, 'Games', 1
INSERT INTO @Department SELECT 7, 'Puzzles', 6
INSERT INTO @Department SELECT 8, 'Mens Wear', null
INSERT INTO @Department SELECT 9, 'Mens Clothing', 8
INSERT INTO @Department SELECT 10, 'Jackets', 9
INSERT INTO @Department SELECT 11, 'Shoes', 9
INSERT INTO @Department SELECT 12, 'Rain Coats', 10

DECLARE  @Level int = 4
;WITH c AS
(
SELECT Id, ParentId, Name, 1 AS Level
FROM @Department
WHERE ParentId IS NULL

UNION ALL

SELECT t.Id, t.ParentId, T.Name, c.Level + 1 AS Level
FROM @Department T
INNER JOIN c on t.ParentId = c.Id   
)
SELECT Id, ParentId, Name, Level

FROM c WHERE c.Level = @Level AND c.Level = @Level - 1 ORDER BY Level ASC

FROM c WHERE c.Level BETWEEN @Level AND @Level - 1 ORDER BY Level ASC

【问题讨论】:

  • 如果你只上一层,你可以把这个表连接到它自己,并将你的条件放在 on 子句中。

标签: sql sql-server sql-server-2008


【解决方案1】:

也许FROM c WHERE c.Level BETWEEN @Level -1 AND @Level ORDER BY Level ASC

【讨论】:

    【解决方案2】:

    这里的代码永远可以工作:

    @Level = @Level - 1
    

    我想你的意思是:

    c.Level = @Level - 1
    

    即便如此...您可能想要OR 而不是AND

    想想你在问什么……“给我同时级别为 4 和 5 的所有记录。”

    你的意思大概是……“给我所有等级为4或5的记录。”

    【讨论】:

      【解决方案3】:

      好的,您的递归 CTE 似乎是正确的。我通常不会将 name 放在 CTE 中(主要是因为表只是父/子字段,或者有太多),然后加入,但它应该仍然可以正常工作。

      正如已经指出的那样,您真正的问题是您的 where 子句是无意义的:

      • WHERE c.Level = @Level AND c.Level = @Level - 1 基本上是在询问 c.level == c.Level - 1 是否 - 总是 错误。
      • WHERE c.Level BETWEEN @Level AND @Level - 1 要求 @Level >= c.Level >= @Level - 1@Level >= @Level - 1 - 另一个不可能的条件。

      如果稍作修改,这些方法中的任何一种都应该可以正常工作:

      • WHERE c.Level = @Level OR c.Level = @Level - 1
      • WHERE c.Level BETWEEN @Level - 1 AND @Level

      @Level 是否输入为 1 无关紧要 - 因为您从一个开始,它没有更低的级别来报告。

      【讨论】:

        【解决方案4】:

        看看下面的 SQL,它返回了 4 行用于级别 3 和 1 用于级别 4:

        SELECT p.Id as ParentId, 
            p.Name as Parent,
            c.Id, 
            c.Name, 
            c.Level
        FROM c as c
        left join c p 
        on p.Id = c.ParentId
        WHERE c.Level = @Level 
        ORDER BY p.Name, c.Name ASC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2018-04-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 2019-11-16
          • 2016-03-18
          相关资源
          最近更新 更多