 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
AAA aiuto in SQL cercasi Clicca QUI per vedere il messaggio nel forum |
| bat-erika |
Sto litigando da troppo tempo con una query maledetta.
Non è che c'è un'anima mia che ne sa più di me, e non è difficile eh, che possa darmi una mano.
Grazie assai :D
Non lo metto nel mercatino perchè non offro retribuzione se non tutta la mia gratitudine. Sta al vostro buon cuore :please: |
| jacktheripper |
dai che ti aiutiamo!!
posta la domanda..(e lo schema delle tabelle ce servono per risolverla) |
| bat-erika |
Vedi che qualche angioletto ancora c'è :D
lo schema delle tabelle è un puttanaio.
e la domanda anche. Facciamo che partiamo dai piccoli problemi interni e man mano andiamo complicando la cosa.
Spiego, c'è la query con il suo select, il suo from e poi tra le varie clausole del where c'è pure questa:
and (
(report_date between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY'))
or
( next_visit between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY') and user_id not in (select user_id from report where report_date between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY') and report.service (QUELLO DI FUORI) = report.service (QUELLO DI DENTRO))
)
)
Il punto è... è possibile fare quello che sto cercando di fare (ovviamente non come l'ho scritto io chè so che è sbagliato...
se si come??? e se no, come posso cambiare per ottenere quello che voglio?
Se non si capisce niente provo a spiegarmi meglio. |
| jacktheripper |
allora...
premesso che:
-non sono una cima in database
-non ho capito esattamente quale sia la tua domanda
ti chiedo:
1)che senso c'è a fare una between tra due date che di fatto sono giorni consecutivi?
2)a livello logico non mi sembra ci siano errori di sorta, è un pò contorto ma mi sembrerebbe corretto
3)se dici che è sbagiato vuol dire che ti dà errori (e quindi non computa la query) oppure ti dà risultati sbagliati (ma qui per sapere cos'è sbagliato bisogna conoscere meglio il problema)
4) non ho capito questo:
eport.service (QUELLO DI FUORI) = report.service (QUELLO DI DENTRO) |
| DarkSchneider |
| dovresti spiegare cosa vuoi ottenere, perchè dalla query non è così trasparente :D |
| Simbios |
| ma la query tua non ti tira fuori nulla o da errore? |
| xSharKMaNx |
and (
(report_date between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY'))
or
( next_visit between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY') and user_id not in (select user_id from report where report_date between to_date('14/05/2008', 'DD/MM/YYYY') and to_date('15/05/2008', 'DD/MM/YYYY') and report.service (QUELLO DI FUORI) = report.service (QUELLO DI DENTRO))
)
)
Quello Fuori = Select iniziale
Quello Dentro = Select annidata
Se è così allora
Dopo che hai fatto il primo FROM TABELLA aggiungi AS QUERY1
Nella seconda SQL dove c'è scritto user_id from report aggiungi AS QUERY2
a questo punto alla fine dovrai fare QUERY1.service = QUERY2.service
Almeno credo da quel che ho visto nella SQL.
Ciao |
| bat-erika |
allora se levo il punto su cui ho problemi che è di fatto una condizione in più è giusta, mi restituisce quello che deve restituire, correttamente.
rispondo a jackripper per punti:
1)che senso c'è a fare una between tra due date che di fatto sono giorni consecutivi?
Sono date a caso che ho messo per fare le prove, il periodo di tempo potrebbe anche essere maggiore. In ogni caso servirebbe il between perchè se ci sono anche ore, minuti secondi etc... a volte se gli metti l'uguale considera il timestamp anzichè la data assoluta e non ti trova cose che invece dovrebbe trovare.
2)a livello logico non mi sembra ci siano errori di sorta, è un pò contorto ma mi sembrerebbe corretto
infatti come dicevo funziona...
3)se dici che è sbagiato vuol dire che ti dà errori (e quindi non computa la query) oppure ti dà risultati sbagliati (ma qui per sapere cos'è sbagliato bisogna conoscere meglio il problema)
è sbagliato perchè così com'è non riuscirebbe a risolvere l'equazione.
4) non ho capito questo:
Questo È IL problema, o almno uno dei tanti... risolto questo passiamo agli altri :D
In pratica lo scopo è prendere da una tabella "REPORT" tutti i report di un "dato periodo", e tutti quelli che che hanno nel campo next_visit una data compresa nel "dato periodo" ma in questo secondo caso, non deve essere presente un altro report compreso nel dato periodo, associato allo stesso servizio.
Quindi traducendo la query in un linguaggio più "comprensibile" diventerebbe:
cerca bla bla bla dove
"la data_del_report è compresa tra a e b OR
(la data_della_prossima_visita è compresa tra a e b e nella stessa tabella non c'è un altro report con (la data_del_report compresa tra a e b e con servizio = al servizio del report con la data_della_prossima_visita compreso tra a e b))"
credo di non essermi chiarita meglio... anzi, temo di aver fatto un casino, è che cazzo è anche difficile da spiegare...
Confido nella vostra intelligenza più che nella mia capacità d'espressione... |
| bat-erika |
Originally posted by xSharKMaNx
Quello Fuori = Select iniziale
Quello Dentro = Select annidata
Se è così allora
Dopo che hai fatto il primo FROM TABELLA aggiungi AS QUERY1
Nella seconda SQL dove c'è scritto user_id from report aggiungi AS QUERY2
a questo punto alla fine dovrai fare QUERY1.service = QUERY2.service
Almeno credo da quel che ho visto nella SQL.
Ciao
questo è il mio select from where "esterno"
quello dove hai detto di mettere query1....
SELECT USERS.ID AS USERID,
USERS.REGISTRATION_DATE AS REG_DATE,
SITE.NAME AS SITE_NAME,
PERSON.NAME AS P_NAME,
PERSON.LAST_NAME AS P_LAST_NAME,
PERSON.NIC AS P_NIC,
CHANNEL.NAME AS C_NAME,
SUBSCRIPTION.SMS_REPORT,
REPORT.ID AS R_ID,
REPORT.REPORT_DATE AS REPORT_DATE,
REPORT.REPORT_LABEL AS LABEL,
REPORT.STATUS AS R_STATUS,
TRACK_TRACE_REPORT.STATUS
FROM USERS, PERSON, SITE, CHANNEL, SUBSCRIPTION, REPORT
LEFT JOIN
TRACK_TRACE_REPORT ON REPORT_ID = REP.ID AND TRACK_TRACE_REPORT.DATE_AND_TIME IN
(SELECT MAX(TRACK_TRACE_REPORT.DATE_AND_TIME) FROM TRACK_TRACE_REPORT WHERE CHANNEL = (SELECT ID FROM CHANNEL WHERE NAME = 'SMS')
AND (DATE_AND_TIME >= TO_DATE('14/05/2008', 'DD/MM/YYYY') AND DATE_AND_TIME < TO_DATE('15/05/2008', 'DD/MM/YYYY'))
GROUP BY REPORT_ID)
WHERE
DOVE LO DEVO METTERE QUERY1?????????? |
| xSharKMaNx |
FROM USERS, PERSON, SITE, CHANNEL, SUBSCRIPTION, REPORT AS QUERY1 LEFT JOIN .... FROM TRACK_TRACE_REPORT AS QUERY2 .... WHERE (QUERY1.SERVICE = QUERY2.SERVICE)
Prova un pò |
| KarmaKOMA |
| Modello dati delle tabelle in questione non ce l'hai?? |
| bat-erika |
forse che forse ho risolto....
forse bastava mettere un alias solo nella query di dentro...
comunque quando la finisco la posto...
però grazie a tutti, e soprattutto a sharkman che con la storia dell'alias mi ha fatto trovare la soluzione. |
| xSharKMaNx |
Originally posted by bat-erika
forse che forse ho risolto....
forse bastava mettere un alias solo nella query di dentro...
comunque quando la finisco la posto...
però grazie a tutti, e soprattutto a sharkman che con la storia dell'alias mi ha fatto trovare la soluzione.
figurati alla prx |
| Loveday |
Originally posted by xSharKMaNx
FROM USERS, PERSON, SITE, CHANNEL, SUBSCRIPTION, REPORT AS QUERY1 LEFT JOIN .... FROM TRACK_TRACE_REPORT AS QUERY2 .... WHERE (QUERY1.SERVICE = QUERY2.SERVICE)
Prova un pò
Scusa ma perchè non
...
FROM TRACK_TRACE_REPORT AS QUERY2 ....
ON QUERY1.SERVICE = QUERY2.SERVICE
?
Solo per curiosità....
Bye,
L. |
| bat-erika |
perchè non risolverebbe il problema.
Non era un join che dovevo fare. comunque la query non l'ho ancora finita (ma non sto facendo SOLO quella, nel frattempo ho fatto anche altre cose).
Quando la finisco ed è funzionante magari la posto così potete "ottimizzarla" (attualmente supera i 2000 caratteri :sbonk: ) |
| xSharKMaNx |
Originally posted by bat-erika
perchè non risolverebbe il problema.
Non era un join che dovevo fare. comunque la query non l'ho ancora finita (ma non sto facendo SOLO quella, nel frattempo ho fatto anche altre cose).
Quando la finisco ed è funzionante magari la posto così potete "ottimizzarla" (attualmente supera i 2000 caratteri :sbonk: )
SELECT
USERS.ID AS USERID,
USERS.REGISTRATION_DATE AS REG_DATE,
SITE.NAME AS SITE_NAME,
PERSON.NAME AS P_NAME,
PERSON.LAST_NAME AS P_LAST_NAME,
PERSON.NIC AS P_NIC,
CHANNEL.NAME AS C_NAME,
SUBSCRIPTION.SMS_REPORT,
REPORT.ID AS R_ID,
REPORT.REPORT_DATE AS REPORT_DATE,
REPORT.REPORT_LABEL AS LABEL,
REPORT.STATUS AS R_STATUS,
TRACK_TRACE_REPORT.STATUS,
TRACK_TRACE_REPORT.DATE_AND_TIME
FROM USERS, PERSON, SITE, CHANNEL, SUBSCRIPTION, REPORT, TRACK_TRACE_REPORT
WHERE TRACK_TRACE_REPORT.ID = REPORT.ID
AND TRACK_TRACE_REPORT.CHANNEL IN ('SMS')
AND TRACK_TRACE_REPORT.DATE_AND_TIME BETWEEN '20080514' AND '20080514'
Questa potrebbe essere una prima ottimizzazione
Non ho bene capito cosa vuoi farti restituire dalla funzione MAX
Comunque sia quando hai la possibilità posta quella finale che cerchiamo di vedere se si può ottimizzare. |
| bat-erika |
diciamo che la prima ottimizzazione non ottimizza :D
track_trace_report.channel è un number, non varchar, e corrisponde all'id dell'entry che nella tabella channel ha sms come nome...
con il max voglio farmi restituire l'entry dalla tabella track trace report che ha come report id quella che gli passo ma che sia l'ultima in ordine di tempo da qui il max(date)
Adesso ho dovuto lasciare la query a metà perchè devo sistemare altre cose prima, ma appena ci torno su ed è un minimo funzionante la posto, così le anime pie altruiste potranno aiutarmi :please: |
|
|
|
|