Vanno bene queste due query per estrarre da due tabelle?

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Ciao a tutti.
Ho due tabelle:

Tabella A (Importazione)

ID RESID BBLIVERATE NOME
1 252 FG95 Lorenzo
2 635 96F68 Mario
3 987 T5274 Pippo


Tabella B (Prenotazioni)

ID RESID BBLIVERATE NOME
1 252 FG95 Lorenzo
2 635 LP426 Mario
3 987 T5274 Pippo

Sono praticamente identiche. Io importo i dati da una fonte xml e li inserisco in importazione (A) .
Devo mostrare due tabelle a video:
- La prima con le nuove importazioni che non esistono nella tabella prenotazioni. Confronto il RESID e se non esiste la visualizzo. E la query dovrebbe andare bene questa:
Codice:
select *,DATE_FORMAT(StartDate,'%d-%m-%Y') as StartD,DATE_FORMAT(EndDate,'%d-%m-%Y') as EndD from 
importazioni where ResId not in (select ResId from prenotazioni)
- La seconda devo verificare se RESID esiste ma se esiste devo verificare anche che il BBLIVERATE sia uguale. Se è uguale non mi interessa ma se è diverso lo mostro a video.
Per questa sembra funzionare questa:

Codice:
SELECT *,DATE_FORMAT(importazioni.StartDate,'%d-%m-%Y') as StartD,DATE_FORMAT(importazioni.EndDate,'%d-%m-%Y') as EndD FROM `prenotazioni`,importazioni WHERE prenotazioni.`ResId`=importazioni.`ResId` and importazioni.`BbliverateId`!=prenotazioni.BbliverateId
Secondo voi vanno bene? Provandole sembra di si ma vorrei qualche consiglio ...

Grazie mille
 

marino51

Utente Attivo
28 Feb 2013
2.869
153
63
Lombardia
nella prima query, inserirei la clausola where, inutile estrarre tutti i valori esistenti quando basta
fare la verifica sul valore cercato
ovviamente ResId della tabella prenotazioni sarà definita con un indice di ricerca

PHP:
select *,DATE_FORMAT(StartDate,'%d-%m-%Y') as StartD,DATE_FORMAT(EndDate,'%d-%m-%Y') as EndD
from importazioni 
where ResId not in (select ResId from prenotazioni where ResId=importazioni.ResId)
nella seconda otterrai il vantaggio dell'indice summenzionato, ma scusami, hai scritto
PHP:
prenotazioni.ResId=importazioni.ResId
quindi io scriverei
PHP:
prenotazioni.BbliverateId!=importazioni.BbliverateId
per una semplice simmetria
ciao
Marino
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Io ho due visualizzazioni diverse fra la prima e la seconda query. Quindi eseguo due query. Se scrivo come hai suggerito te
Codice:
prenotazioni.BbliverateId!=importazioni.BbliverateId
Lui mi estrae anche i record che non mi servono invece io devo estrarre solo gli aggiornamenti. Prendendo per esempio la tabella al primo post lui mi dovrà estrarre solo

2 635 96F68 Mario

che è in importazione. Quello che è in prenotazione non mi interessa perchè suppongo che sia un aggiornamento e quindi lo dovrò sovrascrivere.

Se inserisco
Codice:
prenotazioni.`ResId`=importazioni.`ResId`
lui mi estrae i record giusti (devo fare i test per bene ma sembra giusto)

Sbaglio?

Codice:
 

marino51

Utente Attivo
28 Feb 2013
2.869
153
63
Lombardia
Se inserisco
Codice:
prenotazioni.`ResId`=importazioni.`ResId`
lui mi estrae i record giusti (devo fare i test per bene ma sembra giusto)
questo vale per la prima query, la ottimizza estraendo solo l'elemento cercato in quel momento, e come detto, se il campo prenotazioni.`ResId è indicizzato, ne guadagna nel tempo di esecuzione

Codice:
prenotazioni.BbliverateId!=importazioni.BbliverateId
questa modifica vale solo per la seconda query non cambia assolutamente nulla anche se non la applichi,
è solo una mia "mania" di avere codice ordinato
 

marino51

Utente Attivo
28 Feb 2013
2.869
153
63
Lombardia
crea un indice specifico per il campo ResId della tabella prenotazioni
la tabella non conterrà un numero elevato di records (probabilmente) ma penso che il risultato ne ripaghi il lavoro