Проблема SQL - один адрес 2 в одной таблице - PullRequest
2 голосов
/ 11 февраля 2011
CName           |   AddressLine
-------------------------------
John Smith      | 123 Nowheresville
Jane Doe        | 456 Evergreen Terrace
John Smith      | 999 Somewhereelse
Joe Bloggs      | 1 Second Ave

Если у меня есть эта таблица, можно сделать выбор, чтобы поставить вот так

CNAME      | Address1           | Address2

John Smith | 123 Nowheresville  | 999 Somewhereelse

Я использую оракул

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Считается плохим дизайном (неэффективное использование памяти) добавлять новый столбец для появления дубликатов всего в нескольких строках.Возможно, вам следует рассмотреть возможность использования inner-join и отдельной таблицы для адресного столбца!

1 голос
/ 11 февраля 2011

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

Чтобы свести ваш результирующий набор к одной строке, вам нужно будет каким-то образом пометить «первый» адрес. В SQL Server (или аналогичных RDBM профессионального уровня) для этого можно использовать общее табличное выражение с функциями ранжирования / нумерации строк:

with Addresses as
(select 
    CName, 
    AddressLine, 
    row_number() over (partition by CName order by AddressLine) as RowNum

from YourTable)
select
    a1.CName,
    a1.AddressLine as Address1,
    a2.AddressLine as Address2,
    a3.AddressLine as Address3

from Addresses a1

left join Addresses a2 on a2.CName = a1.CName and a2.RowNum = 2
left join Addresses a3 on a3.CName = a1.CName and a3.RowNum = 3

where a1.RowNum = 1
0 голосов
/ 17 февраля 2011

Проблема решена, Франк Кулаш на форуме оракула решил проблему

Вот решение:

WITH got_r_num  AS
(
    SELECT  cname, addressline
    ,   ROW_NUMBER () OVER ( PARTITION BY  cname
                         ORDER BY      addressline
                   )       AS r_num
    FROM    table_x
--  WHERE   ...     -- If you need any filtering, put it here
)
SELECT    cname
,     MIN (CASE WHEN r_num = 1 THEN addressline END)    AS addressline1
,     MIN (CASE WHEN r_num = 2 THEN addressline END)    AS addressline2
FROM      got_r_num
GROUP BY  cname

Спасибо всем за помощь

0 голосов
/ 11 февраля 2011

temp = имя вашей таблицы

select distinct cname, addressline as [address1],
( 
ISNULL((select addressline from temp where cname = t.cname and addressline != t.addressline), '')
) as address2
from
temp t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...