Использование одного запроса для получения многозначного атрибута путем объединения двух таблиц, не вызывая дублирования полей в MySQL - PullRequest
1 голос
/ 15 сентября 2010

Таблица 1:
ЗАПРОС: Создать таблицу клиента ( applicationNo Int первичный ключ, Имя Варчар (20) );

Вставить оператор: Вставить в значения клиента (1, 'XYZ'), (1, 'ABC'), (1, 'DEF');

applicationNo   |   name  
    1           |   XYZ  
    2           |   ABC  
    3           |   DEF  

Таблица 2:
Запрос: создание таблицы клиента ( applicationNo int, телефон Бигинт, внешний ключ (applicationNo) ссылается на клиента (applicationNo), первичный ключ (приложение NO, 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

Отредактировано: дополнительная информация
Я попытался использовать то, что называется кросс-таб. Но я не могу использовать totalPhoneNo внутри оператора case

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;

Ответы [ 3 ]

1 голос
/ 15 сентября 2010

Попробуйте:

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
1 голос
/ 15 сентября 2010

Вот для 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
0 голосов
/ 15 сентября 2010

использовать подвыборы с предельными предложениями.первый подвыбор выбирает первый телефон, второй - второй.

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
...