1

表1:
QUERY:创建表客户端(applicationNo int primary key, name varchar(20));

插入语句:插入客户值(1,'XYZ'),(1,'ABC'),(1,'DEF');

申请号 | 姓名  
    1 | XYZ  
    2 | 美国广播公司  
    3 | 国防军  

表2:
查询:创建表客户端(applicationNo int,phoneNo Bigint,外键(applicationNo)引用客户端(applicationNo),主键(applicationNO,phoneNo));

插入 phoneNO 值 (1,999999),(1,888888),(2,777777),(3,666666),(3,555555);

申请号 | 电话号码
1 | 999999
1 | 888888
2 | 777777
3 | 666666
3 | 555555

我可以通过以得到以下输出的方式加入两个表来检索元组,但是使用单个查询,我也在使用 mysql 5.1

申请号 | 姓名 | 电话号码1 | 电话No2
1 | XYZ | 999999 | 88888
2 | 美国广播公司 | 77777 | 空值
3 | 防御工事 | 66666 | 555555

已编辑:额外信息
我尝试使用这种称为交叉表的东西。但我无法在 case 语句中使用 totalPhoneNo

选择 applicationNo,count(phoneNo) 作为 totalPhoneNo,  
SUM(CASE WHEN totalPhoneNo= 1 THEN phoneNO ELSE Null END) AS phoneNo1,  
SUM(CASE WHEN totalPhoneNO = 2 THEN phoneNo ELSE Null END) AS phoneNo2  
FROM phoneNO GROUP BY applicationNo;
4

3 回答 3

1

这是针对 MSSQL 的。这转换得好吗?

With phones (ApplicationNo, PhoneNo, Instance) as
(Select ApplicationNo, PhoneNo,
  Row_Number OVER (Partition By ApplicationNo) as RowNum)
Select client.ApplicationNo, client.Name, 
  p1.PhoneNo as phoneNo1, p2.PhoneNo as phoneNo2
From client
  Left Join phones p1 on client.ApplicationNo=p1.ApplicationNo as p1.RowNum=1
  Left Join phones p2 on client.ApplicationNo=p2.ApplicationNo as p2.RowNum=2
于 2010-09-15T14:20:28.953 回答
1

尝试:

select c.applicationNo, 
       max(c.name) name,
       max(p.phoneNo) phoneNo1,
       case 
           when max(p.phoneNo) = min(p.phoneNo) then NULL 
           else min(p.phoneNo) 
       end phoneNo2
from client c
left join phoneNo p on c.applicationNo = p.applicationNo
group by c.applicationNo
于 2010-09-15T16:36:56.120 回答
0

使用带有限制子句的子选择。第一个子选择选择第一个电话,另一个选择第二个。

select ApplicationNo,
(SELECT phoneno FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 0, 1)as phone1,
(SELECT phoneno  FROM phones where phones.applicationno=app.ApplicationNo order by phoneno LIMIT 1, 1)as phone2
from application app
于 2010-09-15T16:15:51.393 回答