Конференция "Базы" » Вопрос по SQL [D7, MSSQL]
 
  • nikefest (16.03.12 13:35) [0]
    Помогите, пожалуйста, решить задачку:
    CREATE TABLE T([P] [int] IDENTITY(1,1) NOT NULL)
    CREATE TABLE T1([P1] [int] IDENTITY(1,1) NOT NULL,
    [PT] [int] NOT NULL)
    CREATE TABLE T2([P2] [int] IDENTITY(1,1) NOT NULL,
    [PT] [int] NOT NULL)
    Все P-ключи, РТ-внешние ключи к таблице Т.
    Нужно получить все записи из Т и соответствующие им из Т1 и Т2 в таком виде:
    Р Р1 Р2
    1 111 211
    1 112 NULL
    1 113 NULL
    2 NULL 221
    2 NULL 222
    3 NULL NULL
    4 141 241

    То есть нужно, чтобы данные из Т1 и Т2 не объединялись, а пересекались по полю РТ
  • stas © (16.03.12 15:21) [1]

    select T.P, T1.P1, T2.P2 from
    T
    Left join T1 on T1.PT=T.P
    Left join T2 on T2.PT=T.P


    Как*то так...
  • nikefest (16.03.12 15:43) [2]
    нет нет. это как раз и получается объединение.
    Мне не важно сделать это одним запросом, может быть как-то через процедуры или через несколько вьюшек
  • stas © (16.03.12 15:55) [3]
    Тогда не понял вопроса, покажите как эти данные выглядят в таблицах
  • nikefest (16.03.12 16:34) [4]
    P
    1
    2
    3
    4

    P1   PT
    111  1
    112  1
    113  1
    141  4

    P2    PT
    211   1
    221   2
    222   2
    241   4
  • stas © (16.03.12 16:58) [5]
    тот запрос вернет такой результат как нужно
  • stas © (16.03.12 17:01) [6]
    А нужно чтобы если в табл 2 1 запись чтобы она не дублировалась?
  • nikefest (16.03.12 17:41) [7]

    > А нужно чтобы если в табл 2 1 запись чтобы она не дублировалась?

    да, да. В том-то и дело. Одним запросом это не сделать. Но никак не могу придумать ни процедуру, ни комбинацию вьюшек.
    Может как-то ввести искуственный ключь в Т1 и Т2, чтобы по нему их соединить?...
  • знайка (16.03.12 17:58) [8]
    а кокой критерий того что 211 должна быть именно с 111 а не с 112 или 113? что-то тут не то
  • nikefest (16.03.12 18:13) [9]

    > а кокой критерий того что 211 должна быть именно с 111 а
    > не с 112 или 113? что-то тут не то

    в этом плане нет критериев, это не важно. Просто нужно чтобы для Р выдавалось максимальное число строк из Т1 или Т2, но не сумма Т1 и Т2
  • Германн © (16.03.12 19:27) [10]

    > в этом плане нет критериев, это не важно. Просто нужно чтобы
    > для Р выдавалось максимальное число строк из Т1 или Т2

    outer join
    http://ru.wikipedia.org/wiki/Join_%28SQL%29
    Если мой телепатор угадал :)
  • знайка (16.03.12 19:29) [11]
    как-то так

    select P, NULL as P1, P2  into #R from T left join t2 on t2.PT=t.P

    update #R set P1 = t1.P1 from #R join T1 on t1.PT=#R.P

    insert into #r
    select PT, t1.P1, NULL AS P2
    from t1 where P1 not in (select P1 from #R where #R.P=T1.PT)

    select * from #R

    drop table #R
    ?
    возможно можно еще более проще  ...
  • знайка (16.03.12 19:47) [12]
    хотя наверное тоже не то. :)
  • Johnmen © (16.03.12 21:08) [13]

    > nikefest   (16.03.12 13:35)  

    Вы сами сначала определитесь, какие именно записи надо выдавать из T1 и T2.
    Например.
    T1 - записи абырвалг11 и абырвалг12
    T2 - записи абырвалг21, абырвалг22 и абырвалг23
    Какие из них интересуют? Где критерий?
  • Кщд (16.03.12 23:01) [14]
    >знайка   (16.03.12 19:29) [11]
    можно без ахинеи?)
    автор сам изрядно не в курсе, чего хочет
    не увеличивайте энтропию)
  • turbouser © (17.03.12 18:49) [15]
    тут сам собой напрашивается ОВСФ
  • nikefest (19.03.12 14:32) [16]
    Ну уж я не знаю как еще объяснить что нужно. Т1 и Т2 между собой не связаны никак. Только через таблицу Т. Вот Знайка скорее всего меня понял, попробую его вариант под номером 11
  • Inovet © (19.03.12 14:41) [17]
    > [16] nikefest   (19.03.12 14:32)
    > Т1 и Т2 между собой не связаны никак. Только через таблицу Т.

    Значит заполняешь Т1 и Т2, потом заполняешь их связь в Т.
  • Кщд (20.03.12 08:17) [18]
    >nikefest   (19.03.12 14:32) [16]
    ок.
    почему в выборке есть:
    Р Р1 Р2
    1 111 211

    но нет:
    Р Р1 Р2
    1 112 211
    1 113 211

    ?
  • nikefest (20.03.12 11:36) [19]

    > почему в выборке есть:
    > Р Р1 Р2
    > 1 111 211
    >
    > но нет:
    > Р Р1 Р2
    > 1 112 211
    > 1 113 211


    ну вот пример попроще: Есть таблица футбольных команд Ф, и две таблицы игроков которые пришли в команду ИП и таблица игроков которые ушли из команды ИУ. Естественно что ИП и ИУ связаны между собой только через таблицу Ф. И вот из команды "Дуболомы" ушли Сидоров и Дубов, а пришел Травкин. Нужно вывести эти данные в таком виде:
    Команда           Ушли      Пришли
    "Дуболомы"    Сидоров    Травкин
    "Дуболомы"    Дубов       Null

    Так понятнее может быть будет
 
Конференция "Базы" » Вопрос по SQL [D7, MSSQL]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]