Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL问题-同一个表中的一个名称2个地址_Sql_Oracle - Fatal编程技术网

SQL问题-同一个表中的一个名称2个地址

SQL问题-同一个表中的一个名称2个地址,sql,oracle,Sql,Oracle,如果我有这个表,可以这样做一个选择放置 CName | AddressLine ------------------------------- John Smith | 123 Nowheresville Jane Doe | 456 Evergreen Terrace John Smith | 999 Somewhereelse Joe Bloggs | 1 Second Ave 我正在使用oracletemp=您的表名 C

如果我有这个表,可以这样做一个选择放置

CName           |   AddressLine
-------------------------------
John Smith      | 123 Nowheresville
Jane Doe        | 456 Evergreen Terrace
John Smith      | 999 Somewhereelse
Joe Bloggs      | 1 Second Ave
我正在使用oracle

temp=您的表名

CNAME      | Address1           | Address2

John Smith | 123 Nowheresville  | 999 Somewhereelse

仅在某些行中添加新列以显示重复,这被认为是一种糟糕的设计(内存使用效率低下)。也许您应该考虑使用内部连接和地址列的单独表! 当您的表保持不变时,您不能使用简单的自连接将其减少到一行。您可以返回具有所有地址的行(只要您为特定的最大地址数进行硬编码),但您的行数始终与给定用户的地址数相同(除非您有办法将单个地址标识为“主地址”)

为了将结果集缩减为一行,您必须提供一些标记“第一个”地址的方法。对于SQL Server(或类似的专业级RDBM),您可以使用带有排名/行编号函数的通用表表达式来执行此操作:

select distinct cname, addressline as [address1],
( 
ISNULL((select addressline from temp where cname = t.cname and addressline != t.addressline), '')
) as address2
from
temp t

问题在于解决,弗兰克·库拉什在甲骨文论坛上解决了问题

以下是解决方案:

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

向所有人求助

@用户-每个
CName
是否最多有2条地址行?另外,你如何知道哪个是1,哪个是2,或者这是任意的?首先,你如何确定他们不是两个不同的人?名称不是唯一的。通常情况下,名称和地址正确地存储在相关表中,因此人们可以有多个addrese。如果您有一个预设的地址数,您可以自行加入该号码的任意次数。如果你不知道这个数字,那么www.mongodb.org他们总是2。如果我使用self-join,它会工作吗?@chx:或者你可以,你知道,正确地规范化地址数据。仅仅因为不知道用户的地址数就切换到NoSql?来吧,这将返回组合的2条记录,比如name,a1,a2和name,a2,a1@macwadu:您从未告诉我们您使用的是哪个数据库系统。对不起,是我的错,我使用的是oracle
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