2016-08-31 56 views
0

我有两个表。一个与财产和一个建筑物。每个属性都与0关联,理论上无限量的建筑物。现在我有这样的代码:SQL - 如何将多行中的单元格连接到单行?

Select Property.ID, Building.Number 
From Properties 
Left Join Buildings on Buildings.pID = Property.ID 

这将返回所有建筑物及其相关属性的表。然而,这意味着,所有的属性出现的次数,因为他们有建筑物。

我想要的是一个结果,其中每个房产都有与其自身相同的行中的建筑物,因此它成为属性和建筑物的结果,而不是建筑物的结果和属性。

编辑:我应该指定,这是一个服务器,我只有读取权限。

+3

您正在使用哪些DBMS? –

+0

我不知道。这不是我可以直接访问的服务器。我通过公司自己的专有软件访问它。 – Mohring

+0

您可以尝试使用GROUP_CONCAT(http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat)或使用PIVOT表(http://www.artfulsoftware。 com/infotree/qrytip.php?id = 78&http://stackoverflow.com/a/7675121/2039790) – Volvox

回答

0

如果物业真的能够拥有无限数量的建筑物,那么这将变得非常困难。您将不得不创建一个包含无限行数的表格(每个潜在建筑物一个),并将其全部设置为NULL,除非有建筑物。

您不能拥有动态数量的列。它将不得不事先设定。有不太理想的解决方法,但它们都与数据库规范化非常相反。

编辑:如果它只是一个查询的结果,你可以使用PIVOT()

0

在SQL Server中,你可以使用STUFF fuctionality的组合结果集。

SELECT P.ID 
     ,STUFF((SELECT ', ' + CAST(b.Number AS VARCHAR(10)) [text()] 
     FROM Buildings b 
     WHERE b.pID = P.ID 
     FOR XML PATH(''), TYPE) 
     .value('.','NVARCHAR(MAX)'),1,2,' ') BuildingNumbers 
FROM Properties p 
+0

谢谢,这个作品!我真正想要的是将b.Numbers分成单个单元格,而不是单个单元格。你知道一个办法吗? – Mohring

+0

建筑物编号是特定于产权?所以我认为这是最好的方式.. –

相关问题