Query complessa

lunedì 08 marzo 2004 - 20.01

Trinità Profilo | Junior Member

ciao a tutti, supponendo di avere una vista o una tabella che riporta grossomodo questi risultati

id_p - id2 - nome - data -
1 - 1 - marco - 10/05/2004
2 - 1 - giovanni - 11/05/2004
3 - 1 - stefano - 13/05/2004
4 - 1 - stefano2 - 18/05/2004
5 - 2 - alex - 18/05/2004
6 - 2 - pietro - 18/05/2004
7 - 2 - stefano2 - 19/05/2004
8 - 2 - stefano2 - 20/05/2004
9 -3 - stefano2 - 18/05/2004
10 -3 - stefano2 - 18/05/2004
11 -4 - stefano2 - 18/05/2004

come posso ottenere un recordset che mi estragga gli ultimi (secondo data) 3 ip_p per ogni id2 ?

cioè alla fine voglio avere

2 - 1 - giovanni - 11/05/2004
3 - 1 - stefano - 13/05/2004
4 - 1 - stefano2 - 18/05/2004
6 - 2 - pietro - 18/05/2004
7 - 2 - stefano2 - 19/05/2004
8 - 2 - stefano2 - 20/05/2004
9 -3 - stefano2 - 18/05/2004
10 -3 - stefano2 - 18/05/2004
11 -4 - stefano2 - 18/05/2004

Brainkiller Profilo | Guru

Ciao,
allora così a prima vista mi vengono in mente due soluzioni.
O utilizzi la clausola TOP per farti restituire i primi 3 Record in base alle condizioni che scegli.
SELECT TOP 3 * FROM Tabella WHERE ID_P=1
però poi dovresti fare una UNION per collegare tutti i risultati esempio:
(SELECT TOP 3 * FROM Tabella WHERE ID_P=1) UNION (SELECT TOP 3 * FROM Tabella WHERE ID_P=2) UNION (... e così via con gli altri...)

Se hai pochi valori possibili di id_p si può fare però se diventano tanti ti uscirebbe una query lunghissima e poco efficiente.
Oppure puoi fare semplicemente un classico Recordset/DataReader con tutti i valori e mentre tu scorri i record prendi solo in considerazione i primi 3 e scarti/salti quelli che non ti servono.
Allo stesso modo se con questi dati devi fare un binding su un datagrid allora, fai un ciclo sul DataSet ed elimini le righe di cui non hai bisogno con questa istruzione:

ds.Tables[0].Rows.RemoveAt(parametro)

dove parametro è l'indice del record che vuoi eliminare.
fammi sapere.
ciao

david


Trinità Profilo | Junior Member

Comincio col ringraziarti per la risposta, ma come dici tu (ci avevo anche pensato) è improponibile. NOn sò prima quanti id2 possiedo quindi non sò com'è prima la query.

Pensavo mi fosse sfuggito qualcosa di banale invece la query e complessa d'avvero.

Ho comunque risolto

Ho fatto così:

seleziono i top id_p per ogni id2, a questo punto gli innesto sopra una query che mi estrae ancora i top id_p per ogni id2 che non siano (not in) nell'elenco di prima.
A questo punto ho il 1° e il 2° valore per ogni id2

Per il 3° valore faccio la union del 1° e del 2° , poi come prima cerca il top id_p not in eleco di prima; così ottengo il 3° valore (chiaramente se c'è)

ora che ho l'elenco degli id_p, è un gioco da ragazzi, gli ri-innesto sopra una query che mi estrae tutti i dettagli per ogni id_p (che è chiave primaria)

Inizialmente la query su sql server 2000 con una tabella da 80 record ci metteva 7 secondi ad eseguirla.
Con continui affinamenti sono arrivato al valore accettabile di 1 sec.

Ho quindi deciso di utilizzare la mia query in una SP al fine di ottimizzare ulteriormente le prestazioni.

Ho chiesto perchè pensavo mi fosse sfuggito che sò un comando che facesse l'operazione direttamente...
Sembra quindi non ci sia

Grazie comunque per l'aiuto

freeteo Profilo | Guru

ho 1a via piu semplice sfruttando le subquery :

select * from miaTabella
where id_p in
(
select id_p from
(
SELECT S.id_p, S.nome, max(S.data)
FROM S
group by id_p,nome
)as tbl
)

praticamente tiri fuori gli id giusti da una query di group by.... ;-)

Trinità Profilo | Junior Member

Grazie anche a te Teo per il contributo ma non ho capito bene il funzionamento della tuo query; partendo da quella + interna

SELECT S.id_p, S.nome, max(S.data)
FROM S
group by id_p,nome

penderesti i max data per ogni id_p che vorrebbe dire niente , cioè tutti, essendo id_p chiave primaria. Se raggruppi per id_p sostanzialmente ottieni ancora tutti. Se invece è un 'errore di battitura e volevi ragguppare per id2, otterresti in questo caso i max per ogni id_2, OK.

Poi selezioni, select id_p from
(
SELECT S.id_p, S.nome, max(S.data)
FROM S
group by id_p,nome
)as tbl

quindi quello che avevi prima ? i massimi id_p per ogni id2

poi selezioni tutto da tutto dalla mia tabella dove id_p è uno di quelli estratti prima. Forse volevi mettere not in, in questo caso effettivamente ottenevi quasi il risultato secondo il mio esempio. Il fatto è che non sai quanti per ogni id2 ne hai

select * from miaTabella
where id_p in
(
select id_p from
(
SELECT S.id_p, S.nome, max(S.data)
FROM S
group by id_p,nome
)as tbl
)

grazie lo stesso comunque, magari non ho capito bene io la query però

Brainkiller Profilo | Guru

Non è che si tratta di una query veramente complessa, il fatto è che il linguaggio SQL non si può adattare a tutto se no sarebbe non solo un linguaggio ma uno strumento per fare analisi di qualunque tipo e aggregare continuamente dati su dati ecc. Invece in alcuni casi sono necessari più passi d'aggregazione magari passando per tabelle temporanee. Magari nel tuo caso sarebbe necessario fare una TOP 3 per ogni id_p e accodare tutti i risultati in una tabella temporanea che poi usi per la pubblicazione dei dati in modo da non sovraccaricare il sql server ogni volta che vuoi quei dati.

ciao
david

lbenaglia Profilo | Guru

> come posso ottenere un recordset che mi estragga gli ultimi (secondo data) 3 ip_p per ogni id2 ?

Ciao Trinità,

una soluzione consiste nel ricorrere alle subquery correlate utilzzando la clausola TOP:

USE tempdb
GO

/* Definisco la tabella dbo.Test */
CREATE TABLE dbo.Test(
id_p int NOT NULL IDENTITY PRIMARY KEY,
id2 tinyint NOT NULL,
nome varchar(10) NOT NULL,
data datetime NOT NULL
)
GO

/* La popolo */
SET NOCOUNT ON
INSERT dbo.Test VALUES(1, 'marco', '20040510')
INSERT dbo.Test VALUES(1, 'giovanni', '20040511')
INSERT dbo.Test VALUES(1, 'stefano', '20040513')
INSERT dbo.Test VALUES(1, 'stefano2', '20040518')
INSERT dbo.Test VALUES(2, 'alex', '20040518')
INSERT dbo.Test VALUES(2, 'pietro', '20040518')
INSERT dbo.Test VALUES(2, 'stefano2', '20040519')
INSERT dbo.Test VALUES(2, 'stefano2', '20040520')
INSERT dbo.Test VALUES(3, 'stefano2', '20040518')
INSERT dbo.Test VALUES(3, 'stefano2', '20040518')
INSERT dbo.Test VALUES(4, 'stefano2', '20040518')
SET NOCOUNT OFF

/* Restituisco i 3 ip_p più recenti per id2 */
SELECT O.*
FROM dbo.Test O
WHERE O.data IN(
SELECT TOP 3 data
FROM dbo.Test
WHERE id2 = O.id2
ORDER BY data DESC
)
ORDER BY O.id_p
GO

/* Output:

id_p id2 nome data
----------- ---- ---------- ------------------------
2 1 giovanni 2004-05-11 00:00:00.000
3 1 stefano 2004-05-13 00:00:00.000
4 1 stefano2 2004-05-18 00:00:00.000
5 2 alex 2004-05-18 00:00:00.000
6 2 pietro 2004-05-18 00:00:00.000
7 2 stefano2 2004-05-19 00:00:00.000
8 2 stefano2 2004-05-20 00:00:00.000
9 3 stefano2 2004-05-18 00:00:00.000
10 3 stefano2 2004-05-18 00:00:00.000
11 4 stefano2 2004-05-18 00:00:00.000

(10 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Test

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

Trinità Profilo | Junior Member

Grazie Lorenzo, in effetti poi girando, girando sui diversi forum mi hanno proposto questa soluzione che funziona correttamente....

ciao

lbenaglia Profilo | Guru

Ciao Trinità (o dovrei dire Alessandro? :-)),

nel rispondere alla tua risposta avevo avvertito un Déjà Vu (e non credo sia colpa di un difetto in Matrix)...
Facendo una ricerca con il mio amico Google ho trovato questo thread:
http://www.google.it/groups?hl=it&lr=&ie=UTF-8&oe=UTF-8&selm=9b7b01c40608%2434527260%24a501280a%40phx.gbl

Guarda un po' chi ti aveva risposto :-D

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

Trinità Profilo | Junior Member

Alessandro, se siamo in ugidotnet o microsoft tech net, in tutti gli altri (html.it, aspitalia.it, dotnethell.it) mi chiamano Trinità ....

e adesso ? pillola rossa o pillola blu ? :)

ciao !

iarrub Profilo | Newbie

Scusate se mi intrometto...io non sono molto esperto..maho capito che il mio problema è molto simile

se ho un database con situazioni aziendali ordinate per data, come faccio a dire alla query prendimi solo l'ultima situazione dell'azienda?

mi spiego meglio:

es:
azienda XXXX n° dipendenti
al 30/01/04 n° 57
al 25/03/04 n° 60
al 12/07/04 n° 80

come faccio a filtrare la mia query dicendogli prendimi di questa ditta la situazione più recente presente in archivio?

potete rispondermi con procedure non complicatissime?
vi ringrazio Luciano

Trinità Profilo | Junior Member

per prendere l'ultima non è difficile (solo l'ulitma)

SELECT TOP 1 * FROM mia_tabella ORDER BY campo_data DESC

iarrub Profilo | Newbie

Ciao scusami tanto...mi puoi spiegare..?
la mia tabella si chiama "ditte" e la colonna delle date si chiama "date"...
cosa devo scrivere? dove?
ciao grazie Luciano

iarrub Profilo | Newbie

Ciao scusa non riesco a capire e far funzionare il top 1 *
riesci a farmi sapere qualcosa?
ciao grazie

Trinità Profilo | Junior Member

Sostanzialmente dici di restituire solo una riga (top 1) da un recordset con ordinamento a data rovesciata (desc) cioè con la più recente in alto

select top 1 * , l'asterisco serve a prendere tutte le colonne (campi) di quella tabella


ma hai sql server ? a mè funziona

rew Profilo | Newbie

ciao l benaglia la tua query si puo adattare anche se utilizzo degli equi join su altre tabelle? cioe se catturo dati da altre tabelle ma il controllo lo faccio solo sulla tabella che voglio ? il controllo e il recupero delle ultime tre con TOP

ho buttato giu una sub della sub della sub query..ma mi sono un po intortato ..bo magari la stanchezza magari l a mia incompetenza
eheh comunque: ti faccio un esempio in questo caso metto top 1 perche voglio un solo risultato ...e quello con la data piu aggiornato..

tabella 1

id id_cod nome data prezzo_id
1 2 bo1 10/10/03 1
2 2 bo2 12/10/03 1
3 2 bo3 13/10/03 1
4 3 bo4 18/10/03 2
5 3 bo5 16/10/03 2
6 3 bo6 19/10/03 2


tabella 2

id_lista prezzo_id categoria prezzo
1 1 bo a 10.50
2 3 bo s 17.50
3 2 bo d 12.50




alla fine dovrei ottenere

nome data prezzo categoria
bo3 13/10/03 10.50 bo a
bo6 19/10/03 12.50 bo d


PS GRAZIE





lbenaglia Profilo | Guru

>alla fine dovrei ottenere
>
>nome data prezzo categoria
>bo3 13/10/03 10.50 bo a
>bo6 19/10/03 12.50 bo d

Ciao rew,

guarda il seguente esempio:

USE tempdb; GO /* Definisco le tabelle */ CREATE TABLE dbo.Tabella1( id int NOT NULL IDENTITY PRIMARY KEY, id_cod int NOT NULL, nome char(3) NOT NULL, data smalldatetime NOT NULL, prezzo_id int NOT NULL ); GO CREATE TABLE dbo.Tabella2( id_lista int NOT NULL IDENTITY PRIMARY KEY, prezzo_id int NOT NULL, categoria char(4) NOT NULL, prezzo decimal(4,2) NOT NULL ); GO /* Le popolo */ INSERT dbo.Tabella1 VALUES(2, 'bo1', '20031010', 1); INSERT dbo.Tabella1 VALUES(2, 'bo2', '20031012', 1); INSERT dbo.Tabella1 VALUES(2, 'bo3', '20031013', 1); INSERT dbo.Tabella1 VALUES(3, 'bo4', '20031018', 2); INSERT dbo.Tabella1 VALUES(3, 'bo5', '20031016', 2); INSERT dbo.Tabella1 VALUES(3, 'bo6', '20031019', 2); INSERT dbo.Tabella2 VALUES(1, 'bo a', 10.50); INSERT dbo.Tabella2 VALUES(3, 'bo s', 17.50); INSERT dbo.Tabella2 VALUES(2, 'bo d', 12.50); GO /* Query */ SELECT Q2.nome , CONVERT(varchar, Q2.data, 103) AS data , T2.prezzo , T2.categoria FROM dbo.Tabella2 AS T2 JOIN ( SELECT T1.Nome, Q1.* FROM dbo.Tabella1 AS T1 JOIN ( SELECT id_cod, prezzo_id, MAX(data) AS data FROM dbo.Tabella1 GROUP BY id_cod, prezzo_id ) AS Q1 ON T1.id_cod = Q1.id_cod AND T1.prezzo_id = Q1.prezzo_id AND T1.data = Q1.data ) AS Q2 ON T2.prezzo_id = Q2.prezzo_id GO /* Output: nome data prezzo categoria ---- ----------- ------- --------- bo3 13/10/2003 10.50 bo a bo6 19/10/2003 12.50 bo d (2 row(s) affected) */ /* Pulizia */ DROP TABLE dbo.Tabella1, dbo.Tabella2;


>PS GRAZIE
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rew Profilo | Newbie

WE ;-) ADESSO GUARDO SUBITO...E POI TI DICO.. MA AD OCCHIO DIREI CHE E PIU CHE GIUSTA!! EHEEH ORA PROVO A STUDIARMELA UN PO.. E TI FACCIO SAPERE
grazie per il momento

rew Profilo | Newbie

aaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhh
sto fondendo...ho applicato la tua teoria a due tabelle e tutto ok...ma con 4 mi sono fuso

praticamente dovrei applicare lo stesso procedimento e teoria e cioe far visualizzare il prezzo di ultima data della tabella tab2 ed unire e far vedere tutti gli altri campi...la tab1 e quella principale e la 2 e quella dei prezzi...singh ci sono sopra da sta notte...

***********************
*****************tab4
tre_codeg,smallint
tre_descrig, varch

*****************tab3
teb_dess varchar
teb_cods smallint

*****************tab1
rr_gruppo, smallint
rr_scom, int
rr_scomx, int
rr_quant, float
rr_conf varchar
rr_codar, varch
rr_descr, varch

*****************tab2
cc_progr int PRIMARY
cc_datag, datetime
cc_datascad, datetime
cc_prezzo, money
cc_tipos, varchar


cioe se io avessi nella tab 2 questi risultati
1 2 bo1 10/10/03 1
2 2 bo2 12/10/03 1
3 2 bo3 13/10/03 1


dovrei far vedere solo quello con data piu nuova...sono cotto

lbenaglia Profilo | Guru

>praticamente dovrei applicare lo stesso procedimento e teoria
>e cioe far visualizzare il prezzo di ultima data della tabella
>tab2 ed unire e far vedere tutti gli altri campi...la tab1 e
>quella principale e la 2 e quella dei prezzi...singh ci
>sono sopra da sta notte...

Se desideri ricevere aiuto posta un esempio completo con la struttura di tutte le tabelle (CREATE TABLE), constraints PRIMARY KEY e FOREIGN KEY, alcune righe di prova (INSERT INTO) ed il result set finale che vuoi ottenere.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rew Profilo | Newbie

effettivamente scusa..

Ho creato questo esempio spero possa essere piu chiaro


CREATE TABLE [listin] (
[id_lista] int IDENTITY(1, 1) NOT NULL,
[listino] int NOT NULL,
[data_agg] datetime NOT NULL,
[prezzo] money NOT NULL,
[li_cod] varchar(100) COLLATE Latin1_General_CI_AS
)
ON [PRIMARY]
GO


//li_cod e [id_cod] sono correlati
listino per il momento come valore default metto 1 ma in seguito potra variare..(1 2 3) per adesso utilizziamo il valore 1

INSERT INTO [dbo].[listin] ([listino], [data_agg], [prezzo], [li_cod] )
VALUES ( 1, '2006-04-28 00:00:00.000', 12.2300, '1' )

INSERT INTO [dbo].[listin] ([listino], [data_agg], [prezzo], [li_cod] )
VALUES ( 1, '2006-04-22 00:00:00.000', 35.5600, '1' )

INSERT INTO [dbo].[listin] ([listino], [data_agg], [prezzo], [li_cod] )
VALUES ( 1, '2005-04-23 00:00:00.000', 56.0000, '2' )

INSERT INTO [dbo].[listin] ([listino], [data_agg], [prezzo], [li_cod] )
VALUES ( 1, '2006-02-22 00:00:00.000', 10.2300, '2' )

GO


INSERT INTO [dbo].[articoli] ([id_cod], [nome] )
VALUES ( 1, 'bo1' )

INSERT INTO [dbo].[articoli] ([id_cod], [nome] )
VALUES ( 2, 'bo2' )

INSERT INTO [dbo].[articoli] ([id_cod], [nome] )
VALUES ( 3, 'bo3' )

GO


vorrei ottenere 1 solo articooo con il prezzo piu aggiornato della tabella listin

id nome prezzo data_agg

1 bo1 12.23 28/04/2006
2 bo2 10.23 22/02/2006
3 etc


ciao e grazie

lbenaglia Profilo | Guru

>Ho creato questo esempio spero possa essere piu chiaro

Ciao rew,

Ti sei dimenticato di postare la CREATE TABLE articoli ma non importa, l'ho dedotta dal comando di INSERT.

> [li_cod] varchar(100) COLLATE Latin1_General_CI_AS
>
>//li_cod e [id_cod] sono correlati
>listino per il momento come valore default metto 1 ma in seguito
>potra variare..(1 2 3) per adesso utilizziamo il valore 1

Perché li_cod è definito come varchar(100) se il suo contenuto sarà un ID numerico?
Nel mio esempio sia li_cod che id_cod sarannodefiniti come int.

Il ragionamento è sempre quello discusso in precedenza:

1) Ricavo la data più recente per articolo (Q);
2) Eseguo una JOIN con la tabella listin per recuperare il prezzo utilizzando le colonne articolo e data (Q2);
3) Eseguo una JOIN con la tabella articoli per recuperare le altre colonne utilizzando la colonna articolo.

USE tempdb; GO /* Definisco le tabelle */ CREATE TABLE dbo.articoli( id_cod int NOT NULL PRIMARY KEY, nome char(3) NOT NULL ); GO CREATE TABLE dbo.listin( id_lista int IDENTITY(1, 1) NOT NULL, listino int NOT NULL, data_agg datetime NOT NULL, prezzo money NOT NULL, li_cod int NOT NULL, CONSTRAINT FK_listin_articoli FOREIGN KEY(li_cod) REFERENCES dbo.articoli(id_cod) ); GO /* Le popolo */ INSERT dbo.articoli VALUES(1, 'bo1'); INSERT dbo.articoli VALUES(2, 'bo2'); INSERT dbo.articoli VALUES(3, 'bo3'); INSERT dbo.listin VALUES(1, '2006-04-28 00:00:00.000', 12.2300, '1'); INSERT dbo.listin VALUES(1, '2006-04-22 00:00:00.000', 35.5600, '1'); INSERT dbo.listin VALUES(1, '2005-04-23 00:00:00.000', 56.0000, '2'); INSERT dbo.listin VALUES(1, '2006-02-22 00:00:00.000', 10.2300, '2'); GO /* Query */ SELECT A.id_cod , A.nome , Q2.prezzo , CONVERT(varchar, Q2.data_agg, 103) AS data_agg FROM dbo.articoli AS A JOIN ( SELECT Q.*, L.prezzo FROM ( SELECT li_cod, MAX(data_agg) AS data_agg FROM dbo.listin GROUP BY li_cod ) AS Q JOIN dbo.listin AS L ON Q.li_cod = L.li_cod AND Q.data_agg = L.data_agg ) AS Q2 ON A.id_cod = Q2.li_cod ORDER BY A.id_cod; GO /* Output: id_cod nome prezzo data_agg ----------- ---- --------------------- ----------- 1 bo1 12,23 28/04/2006 2 bo2 10,23 22/02/2006 (2 row(s) affected) */ /* Pulizia */ DROP TABLE dbo.listin, dbo.articoli;

>ciao e grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rew Profilo | Newbie

CREATE TABLE [dbo].[articoli] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[id_cod] [varchar] (10) COLLATE Latin1_General_CI_AS NOT NULL ,
[nome] [char] (3) COLLATE Latin1_General_CI_AS NOT NULL ,
[cat] [int] NULL
) ON [PRIMARY]
GO


GO

CREATE TABLE [dbo].[categorie] (
[cat] [char] (10) COLLATE Latin1_General_CI_AS NULL ,
[id_cat] [smallint] NULL ,
[id] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
GO


INSERT INTO [dbo].[articoli] ([id_cod], [nome], [cat] )
VALUES ( '1', 'bo1', 1 )

INSERT INTO [dbo].[articoli] ([id_cod], [nome], [cat] )
VALUES ( '2', 'bo2', 2 )

INSERT INTO [dbo].[articoli] ([id_cod], [nome], [cat] )
VALUES ( '3', 'bo3', 3 )

******************************************

INSERT INTO [dbo].[categorie] ([cat], [id_cat] )
VALUES ( 'sassi', 1 )

INSERT INTO [dbo].[categorie] ([cat], [id_cat] )
VALUES ( 'pentole', 2 )

INSERT INTO [dbo].[categorie] ([cat], [id_cat] )
VALUES ( 'susine', 3 )

ciao per il discorso varchar non saprei perche e stato messo cosi..infatti anchio avrei messo int pero ho ricreato un esempio abbastanza fedele rispetto alle tabelle su cui devo lavorare adesso mi studio bene la tua sintassi..e provo ad aggiungere la tabella categorie alla sintassi io solitamente utilizzo una sintassi SQL server il metodo ANSI non mi e congeniale..ma comunque vorrei capirlo a modo..ad esempio le lettere che metti prima dei campi le scegli a caso? cioe invece che T o Q potevo mettere Z B etc??



/* Output:

id_cod nome prezzo data_agg categoria
----------- ---- --------------------- -----------
1 bo1 12,23 28/04/2006 sassi
2 bo2 10,23 22/02/2006 pentole



provero a:
ad aggiungere una clausola tipo AND Q2.listino = 1 oppure where listino = 1 si potrebbe mettere tanquillamente in fondo?

e provero a metter dentro le categorie che vengono richiamate a parte..

ciao e grazie devo dire che sei potente

lbenaglia Profilo | Guru

>ciao per il discorso varchar non saprei perche e stato messo
>cosi..infatti anchio avrei messo int pero ho ricreato un esempio
>abbastanza fedele rispetto alle tabelle su cui devo lavorare

Beh, puoi sempre cambiarlo.
E' MOLTO importante utilizzare i data type giusti in base ai valori che si andranno a memorizzare; il data type può essere considerato una prima forma di constraint, nel senso che vincoli il tipo di dato ed il suo range di validità, inoltre determina lo spazio fisico che andrai ad allocare popolando il database.

>adesso mi studio bene la tua sintassi..e provo ad aggiungere
>la tabella categorie alla sintassi

Prova, prova...

>io solitamente utilizzo una
>sintassi SQL server il metodo ANSI non mi e congeniale

Eh?!

>..ma comunque
>vorrei capirlo a modo..ad esempio le lettere che metti prima
>dei campi le scegli a caso? cioe invece che T o Q potevo mettere
>Z B etc??

Quelle "lettere" identificano degli alias di tabella, ovvero "una scorciatoia" per evitare di dover ripetere per intero il nome della tabella per identificare le colonne.
Puoi utilizzare i nomi che più ti aggradano.

>provero a:
>ad aggiungere una clausola tipo AND Q2.listino = 1 oppure
>where listino = 1 si potrebbe mettere tanquillamente in fondo?

Ha molto più senso filtrare SUBITO i dati che ti servono, non credi?
Inserisci quell'argomento di ricerca nella prima tabella derivata:

SELECT li_cod, MAX(data_agg) AS data_agg FROM dbo.listin WHERE listino = 1 GROUP BY li_cod

>e provero a metter dentro le categorie che vengono richiamate
>a parte..

In bocca al lupo

>ciao e grazie devo dire che sei potente
Si, vabbé, lasciamo perdere che è meglio...

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rew Profilo | Newbie

we

Si puo’ utilizzare la sintassi ansi o sql per produrre lo stesso risultato, ma non entrambe.
ANSI
SELECT tab.col, tab.col,
FROM tab1 [join type] JOIN tab2 ON search_cond
WHERE condition


SQL Server
SELECT tab.col, tab.col FROM tab1, tab2
WHERE tab1.col1 = tab2.col1

io di solito sviluppo con la 2° SQL Server in questo caso vorrei utilizzare la tua sintassi perche voglio capirla a modo solitamente utilizzo altri db e non ms sql (prediligo mysql) pero vorrei capire un po di piu ms sql e per quello che sto cercando di sviluppare con questo db...bisogna sempre studiare ed andare avanti...eheh

adesso provo un po a scancherare con il metodo ed i consigli dati da te...vediamo cosa salta fuori..

Ps. Perche non ti ritieni Potente? eheh???

lbenaglia Profilo | Guru

>we
>
>Si puo’ utilizzare la sintassi ansi o sql per produrre lo stesso
>risultato, ma non entrambe.
>ANSI
>SELECT tab.col, tab.col,
>FROM tab1 [join type] JOIN tab2 ON search_cond
>WHERE condition
>
>
>SQL Server
>SELECT tab.col, tab.col FROM tab1, tab2
>WHERE tab1.col1 = tab2.col1
>
>io di solito sviluppo con la 2° SQL Server

Ma a che versione sei rimasto?
Sinceramente non ricordo quando fu introdotto in SQL Server l'operatore JOIN (ho iniziato con la 6.5 ed era già supportato).

>in questo caso vorrei
>utilizzare la tua sintassi perche voglio capirla a modo solitamente
>utilizzo altri db e non ms sql (prediligo mysql) pero vorrei
>capire un po di piu ms sql e per quello che sto cercando di sviluppare
>con questo db...bisogna sempre studiare ed andare avanti...eheh

Bravo, impara la sintassi ANSI SQL-92 e cerca di slegarti il più possibile da ogni "personalizzazione".

>adesso provo un po a scancherare con il metodo ed i consigli
>dati da te...vediamo cosa salta fuori..



>Ps. Perche non ti ritieni Potente? eheh???
Perché sono un disastro, ma tu non dirlo a nessuno, OK?
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rew Profilo | Newbie

"cacchio"...effettivamente i manuali son o un po vecchiotti utilizzo comunque una versione msde 2000 anche se vorrei passare alla 2005 pero dato che non lo uso spesso preferisco capire tutto ogni mezzo...per arrivare alla meta...mi mancano delle basi..magari conosco e so fare cose piu diffici....e non cose che per te sono elementari..con mssql come le subquery e legarle a modo..se devo legare 5 o sei tabelle a volte mi perdo...invece con il metodo che utilizzo no (quello tipo sql server)

Anche se utilizzano tutte e due linguaggi SQL MS SQL E MYSQL sono diversi per moltissime cose...e poi MS SQL cambia anche a seconda della versione (credo)

quindi tu dici che il metodo che utilizzo io è obsoleto?? la sintassi corretta e quella che utilizzi tu adesso ??

solitamente io programmo con mysql e le query le imposto sullo stile del SQL sERVER...mysql rispetto a ms sql ha comandi a volte piu ampi e piu favorevoli al linguaggio di base che adotto PHP cioe e piu ottimizzato e permette piu cose rispetto a mssql

un esempio e TOP in mysql è Limit ed e secondo me piu versatile...poi ripeto magari mi sbaglio

comunque adesso non ti conosco bene e nemmeno le tue competenze ma mi sembri una persona preparata..e gentile-..molto meglio di persone che non sanno fare nulla e si spacciano per (bill gates) e di cialtroni incompetenti ce ne sono tanti nel web...gente che non sa nemmeno cosa sia una stringa o una variabile e nei forum fa da padrone solo perche ha piu post eheh ciao a piu tardi ehehhehehehe ti faccio sapere come procede.....mi sembra di averci quasi capito..eheh

rew Profilo | Newbie

dopo un paio di manuali...eheheheh diciamo che iniziamo ad esserci eheh! ho capito!

TADAN du dun du dun du dun(qua la sigla del TELEFUNKEN)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5