在sql语句中联合父表和子表以获取两个表的记录

时间:2014-11-05 11:59:59

标签: mysql sql sql-server sql-server-2008

我有两个表一个父表

ID Name
1  Sam
2  Ricky

然后我有一个子表,这里我们有一对多的关系,像记录sam有多个地址

喜欢(儿童表)

ID Parent_ID Address
1  1         Newyork
2  1         Chicago

现在我想做的是编写一个查询,我将从表中获取数据,如

ID Name Address1 Address2
1  Sam  Newyork  Chicago

我知道现有的最大地址是多少。甚至一些数据也有一个地址。在这种情况下,Address2将为null或为空。

感谢您的帮助!!

3 个答案:

答案 0 :(得分:2)

使用INNER JOINPIVOT你可以获得结果。试试这个..

CREATE TABLE #par
  (
     ID   INT,
     Name VARCHAR(100)
  )

INSERT #par
VALUES (1,'Sam'),
       (2,'Ricky')

CREATE TABLE #chil
  (
     ID        INT,
     Parent_ID INT,
     Addresss  VARCHAR(100)
  )

INSERT #chil
VALUES( 1,1,'Newyork'),
       (2,1,'Chicago')


SET @col=(SELECT ',[' + Cast(Addresss AS VARCHAR(100)) + ']'
          FROM   #chil
          FOR XML PATH(''))

SELECT @col = RIGHT(@col, Len(@col) - 1)

SET @col1=(SELECT ',[' + Cast(Addresss AS VARCHAR(100))
                  + '] as Address'
                  + CONVERT(VARCHAR(50), Row_number() OVER (ORDER BY ID))
           FROM   #chil
           FOR XML PATH(''))

SELECT @col1 = RIGHT(@col1, Len(@col1) - 1)

SET @sql= 'SELECT id,name,' + @col1
          + '
    FROM   (SELECT a.id,
                   a.name,
                   b.Addresss Addresss
            FROM   #par a
                   INNER JOIN #chil b
                           ON a.id = b.Parent_ID) p
           PIVOT (Max(Addresss)
                 FOR Addresss IN(' + @col + ')) AS piv '

EXEC Sp_executesql
  @sql 

输出

id  name    Address1    Address2
1   Sam      Newyork    Chicago

答案 1 :(得分:-1)

应该是

select * from parent inner join child on child.parent_id = parent.id

但这很简单。也许我错过了你的问题?

答案 2 :(得分:-1)

mssql中的解决方案是关键字PIVOT。

我很快就会添加一个例子