Utilizzando un'unica query per recuperare attributo multivalore unendo due tabelle senza causare la duplicazione di campi in mysql

StackOverflow https://stackoverflow.com/questions/3717714

  •  02-10-2019
  •  | 
  •  

Domanda

Tabella 1:
DOMANDA: Crea cliente tabella (  applicationNo chiave primaria int,  Nome varchar (20) );

Inserisci dichiarazione: Inserire in valori client (1, 'XYZ'), (1, 'ABC'), (1, 'DEF');

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

Tabella 2:
Domanda: Creare cliente tavolo (  applicationNo Int,  phoneNo BIGINT,  chiave esterna (applicationNo) riferimenti del cliente (applicationNo),  chiave primaria (applicationNO, phoneNo) );

Inserisci in valori phoneNO (1,999999), (1,888888), (2,777777), (3,666666), (3,555555);

applicationNo | phoneNo
1             |   999999
1             |   888888
2             |   777777
3             |   666666
3             |   555555

Posso recuperare le tuple unendo entrambe le tabelle in modo tale che ottiene il seguente output, ma utilizzando un'unica query, anche io sto usando MySQL 5.1

applicationNo |   name | phoneNo1 | phoneNo2 
1             |   XYZ  |  999999  |   88888
2             |   ABC  |  77777   |   Null
3             |   DEF  |  66666   |   555555

A cura: informazioni extra
Ho provato ad utilizzare questa cosa chiamata scheda croce .Ma io non sono in grado di utilizzare il totalPhoneNo all'interno della istruzione 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;
È stato utile?

Soluzione

Prova:

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

Altri suggerimenti

Ecco è per MSSQL. Fa questo ben convertito?

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

subselect d'uso con clausole limite. il primo subselect prende il primo telefono l'altro il secondo.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top