оператор выбора, где пункт два условия - PullRequest
2 голосов
/ 23 декабря 2011

У меня проблема с моим оператором 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

Ответы [ 4 ]

2 голосов
/ 23 декабря 2011

Может быть FROM c WHERE c.Level BETWEEN @Level -1 AND @Level ORDER BY Level ASC

1 голос
/ 23 декабря 2011

Этот код здесь НИКОГДА не может работать:

@Level = @Level - 1

Я думаю, вы хотели сказать:

c.Level = @Level - 1

И даже при этом ... вы, вероятно, хотите OR вместо AND.

Подумайте о том, что вы спрашиваете ... "Дайте мне все записи, где уровень 4 и 5 одновременно."

То, что вы хотите сказать, это, вероятно ... "дай мне все записи, где уровень 4 или 5".

0 голосов
/ 23 декабря 2011

Хорошо, ваш рекурсивный 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- поскольку вы начинаете с одного, нижнего уровня для отчета нет.

0 голосов
/ 23 декабря 2011

Посмотрите на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...