(TRANSACT SQL) Как создать Master-Detail подряд с помощью SQL? - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть две таблицы

table1
------
ID
NAME
ADDRESS

table2
-------
ID
PHONE
EMAIL

как я могу создать такой отчет

------------------------------------


01   Dave   123 Veneu

     555-5  A@YAHOO.COM
     66-66  B@Yahoo.co.id
     213-1  D@c.com


02   John   23 Park

     322-1  C@you.com
     54-23  D@Net.com
     231-2  me@you.com

я использую SQL Server 2005 Express, заранее спасибо.

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

Ты не должен.Это общий принцип, что форматирование не должно выполняться на уровне базы данных.

SQL Server должен использоваться для генерации данных, тогда ваше приложение должно обрабатывать данные, включая форматирование.*

Я бы открыл два запроса.Тот, который загружает таблицу один, упорядоченный по столбцу ID.И другой, который загружает таблицу два, также упорядочен по столбцу ID.Затем вы можете перебирать оба набора записей одновременно, например, следующий псевдокод ...

rs1 = SQL.Execute("SELECT * FROM table1 ORDER BY ID")
rs2 = SQL.Execute("SELECT * FROM table2 ORDER BY ID, phone")

rs2.Next()
WHILE rs1.Next()
  Output The Address Info Here
  WHILE rs1.ID = rs2.ID
    Output The Phone/Email Info Here
    rs2.Next()
  END WHILE
END WHILE
1 голос
/ 08 ноября 2011

Не знаю, почему вы захотите написать что-то еще, кроме дизайнера отчетов, но просто так:

SELECT ID AS Column1, NAME AS Column2, Address AS Column3, ID AS SortColumn1, 1 AS SortColumn2
UNION
SELECT '', PHONE, EMAIL, ID AS SortColumn1, 2 AS SortColumn2
ORDER BY SortColumn1, SortColumn2

Выходные данные будут в основном бредом, и у вас есть два дополнительных столбца в конце, от которых нужно избавиться.

0 голосов
/ 08 ноября 2011

Я полностью согласен с dems, но если вам действительно нужно придумать что-то подобное, может сработать следующее (хотя и без пустых строк)

 SELECT case 
            when group_rn = 1 then id 
            else ''
        end as id, 
        case 
          when group_rn = 1 then name
          else phone 
        end as name_phone_column, 
        case 
          when group_rn = 1 then address
          else _email 
        end as address_email_column
 FROM (
     SELECT t1.id,
            t1.name,
            t1.address,
            t2.email,
            t2.phone, 
            row_number() over (partition by t1.id order t1.name) as group_rn
     FROM table1 t1
        LEFT JOIN table2 t2 ON t1.id = t2.id
 ) t
 ORDER BY id

Это предполагает, что phone и name оба имеют одинаковый тип данных, как address и email.

0 голосов
/ 08 ноября 2011

Чтобы иметь отношение один-ко-многим, как в вашем примере (у одного человека есть несколько телефонов и адресов электронной почты), вам нужно добавить какой-то столбец ссылок во вторую таблицу, который будет содержать идентификатор этого человека электронная почта / телефон принадлежит.

Итак, структура вашей таблицы должна выглядеть следующим образом:

table1
------
ID
NAME
ADDRESS

table2
-------
ID
TABLE1_ID
PHONE
EMAIL

Затем вы можете запросить данные с помощью объединений:

SELECT table1.name, table1.address, table2.phone, table2.email WHERE table2.table1_id = table1.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...