Справка Sql Union Query - PullRequest
       3

Справка Sql Union Query

4 голосов
/ 24 июня 2010

Мне нужна помощь в написании запроса. У меня есть эти данные ...

vDir    iNumber
North   19
North   27
North   29
North   31
South   46
South   49
South   51
South   61

Мне нужно запросить данные и получить что-то вроде этого

vDir    iLowNumber    iHiNumber
North   19            27
North   27            29
North   29            31
South   46            49
South   49            51
South   51            61

Идея здесь состоит в том, чтобы выбрать направление, LowNum и затем nextNumber. Также, когда направление меняется, чтобы начать все сначала. (Вот почему я думаю, что мне нужен Союз, может быть, получить Север, затем Союз Юг). Обратите внимание, что наибольшее число в каждом направлении не создает запись, потому что нет более высокого числа. Первый набор имеет 8 записей, а результат запроса - только 6. Как я могу создать запрос, который будет делать это? Любая помощь приветствуется. Также это база данных SQL 2008, поэтому я могу использовать 2008 TSQL. Мне нужен курсор здесь? Возможно, лучше использовать c # и Linq? Мне действительно любопытно, как это сделать в SQL. Спасибо, ребята!

Ура, ~ ck в Сан-Диего

Ответы [ 4 ]

2 голосов
/ 24 июня 2010

Другое возможное решение:

SELECT
    T1.vDir,
    T1.iNumber AS iLowNumber,
    T2.iNumber AS iHiNumber
FROM
    My_Table T1
INNER JOIN My_Table T2 ON
    T2.vDir = T1.vDir AND
    T2.iNumber > T1.iNumber
LEFT OUTER JOIN My_Table T3 ON
    T3.vDir = T1.vDir AND
    T3.iNumber > T1.iNumber AND
    T3.iNumber < T2.iNumber
WHERE
    T3.vDir IS NULL  -- If this is NULL it means that no rows exist between T1 and T2
1 голос
/ 24 июня 2010
    select a.vDir, 
           a.iNumber as iLowNumber, 
           b.iNumber as iHiNumber 
      from TheTable a
inner join TheTable b on a.vDir = b.vDir
                  and a.iNumber < b.iNumber 
                  and not exists(select 1 
                                   from TheTable c 
                                  where a.vDir = b.vDir
                                    and a.iNumber < c.iNumber 
                                    and c.iNumber < b.iNumber)

Интересно, что на данный момент существует 3 разных ответа, каждый с разными характеристиками производительности.

0 голосов
/ 24 июня 2010

На мой взгляд, наиболее естественным решением является:

select t1.vdir, t1.inumber as lownumber, min(t2.inumber) as highnumber
from mytable t1
join mytable t2 on t2.vdir=t1.vdir
  and t2.inumber>t1.inumber
group by t1.vdir, t1.inumber
order by t1.vdir, t1.inumber

Как производительность сравнивается с другими решениями, которые я не исследовал.

0 голосов
/ 24 июня 2010

Это будет хорошо

select * from(
 select direction,inumber as low,
 (select top(1) inumber  from cte as b where b.direction=a.direction
 and b.INumber>a.inumber) as high
 from cte as a
 ) as x where high is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...