使用单个查询通过连接两个表来检索多值属性,而不会引起MySQL中的字段重复
题
表格1 :
查询:创建表客户端(applicationno int primary键,name varchar(20));
插入语句:插入客户端值(1,'xyz'),(1,'abc'),(1,'def');
applicationNo | name 1 | XYZ 2 | ABC 3 | DEF
表2:
查询:创建表客户端(applicationno int,Phoneno bigint,外键(ApplicationNo)引用client(applicationno),primary键(applicationno,phoneno));
插入Phoneno值(1,999999),(1,888888),(2,777777),(3,666666),(3,555555);
applicationNo | phoneNo 1 | 999999 1 | 888888 2 | 777777 3 | 666666 3 | 555555
我可以通过加入两个表以获取以下输出的方式来检索元组,但是使用单个查询,我也使用MySQL 5.1
applicationNo | name | phoneNo1 | phoneNo2 1 | XYZ | 999999 | 88888 2 | ABC | 77777 | Null 3 | DEF | 66666 | 555555
编辑:额外信息
我尝试使用这种称为Cross Tab的东西。但是我无法在案例语句中使用TotalPhoneno
SELECT applicationNo,count(phoneNo) as 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;
解决方案
尝试:
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
其他提示
这是用于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
使用具有极限条款的子选择。第一个子选择选第一个手机另一个手机第二个手机。
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
不隶属于 StackOverflow