Как я могу сделать это в SQL?Мне нужно найти возможные перестановки небольшой таблицы данных - PullRequest
4 голосов
/ 25 июня 2010

У меня есть небольшая таблица данных.

 Dir   LinkL  LinkH
 East  19   27
 East  27   29
 East  29   31
 West  46   49
 West  49   51
 West  51   61

Они представляют собой возможные поездки.Как я могу запросить это?Например, если вы начали на станции 19, вы можете перейти с 19-> 27, 19-> 29 и 19-> 31.Три возможных "поездки" Но начиная с 27, у вас есть только две возможные "поездки", 27-> 29 и 27-> 31, наконец, начиная с 29, дает только одну возможную поездку 29-> 31.Если идти на восток, то по тому же сценарию на запад вы можете совершить 3 возможных «путешествия», начиная со станции 46, 46-> 49, 46-> 51, & 46-> 61 и т. Д.6 входов.Как мне написать запрос на что-то подобное?Я начал с чего-то вроде

SELECT t1.Dir, t1.LinkL FROM tblA t1 INNER JOIN tblA t2 ON t1.Dir = t2.Dir AND t2.LinkL > t1.LinkL

, но мои навыки в Sql несколько ограничены.

Желаемый результат будет примерно таким:

East        19  27
East        19  29
East        19  31
East        27  29
East        27  31
East        29  31
West        46  49
West        46  51
West        46  61
West        49  51
West        49  61
West        51  61

Создание для 12 возможных "поездок". Есть ли кто-нибудь, кто может указать мне правильное направление?Я не возражаю против двух отдельных запросов и объединяю результаты вместе.В случае, если направление делает это более сложным.Я также пытаюсь избежать ужасного курсора.

Спасибо за любую помощь.

Приветствия,
~ ск

Ответы [ 2 ]

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

Это работает:

;WITH trip_cte AS
(
    SELECT
        T1.dir,
        T1.linkl AS start,
        T1.linkh AS finish
    FROM
        dbo.Trips T1
    UNION ALL
    SELECT
        CTE.dir,
        CTE.start,
        T.linkh AS finish
    FROM
        trip_cte CTE
    INNER JOIN dbo.Trips T ON
        T.linkl = CTE.finish
)
SELECT
    dir,
    start,
    finish
FROM
    trip_cte
0 голосов
/ 25 июня 2010

Попробуйте:

SELECT mt1.Dir, mt1.LinkL, mt2.LinkH
 from #MyTable mt1
  inner join #MyTable mt2
   on mt2.Dir = mt1.Dir
    and mt2.LinkH > mt1.LinkL
 order by mt1.Dir, mt1.LinkL, mt2.LinkH

Положения ON не должны основываться на равенствах ...

...