2011-11-08 19 views
0

我有两个表(处理SQL)如何在连续使用SQL创建主详细?

table1 
------ 
ID 
NAME 
ADDRESS 

table2 
------- 
ID 
PHONE 
EMAIL 

哪能像使用SQL Server 2005 Express的这个

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


01 Dave 123 Veneu 

    555-5 [email protected] 
    66-66 [email protected] 
    213-1 [email protected] 


02 John 23 Park 

    322-1 [email protected] 
    54-23 [email protected] 
    231-2 [email protected] 

IM创建的报告,,谢谢提前。

+1

你的数据模型是否正确?电子邮件地址和电话号码处于“1-1”关系很少见。 –

回答

1

不知道为什么你真的愿意在除报表设计等什么写这篇文章,但只是为了它的地狱:

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

为了有一个一对多的关系,因为在你的例子(一个人有多个电话和电子邮件),你需要某种形式的链接栏添加到第二个表,该表将包含的标识电子邮件/电话所属的人。

所以,你的表结构应该是这样的:

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 
1

你不应该。这是一个一般原则,格式化不应该在数据库层来完成。

SQL Server应该用于生成数据,然后你的应用程序应该处理数据,包括格式。

我就开两个查询。一个加载表1,由ID列排序。另一个是装载表格2,也是由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 
0

我强烈机电工程署署长同意,但如果你真的需要拿出类似的东西时,以下可以工作(尽管没有空行)

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 

这假定phonename都具有相同的数据类型,就像addressemail