query particolare
gmanunta81 non è online. Ultima attività: 15/08/2008 11.24.19gmanunta81
Inserito il: 22 maggio 2008 12.15
56 messaggi dal 24 mar 2008 Istalla Microsoft Silverlight!
salve a tutti provo a postare qui il seguente commento
ho dei problemi con una query sql cosi provo a chiedere aiuto qui
supponiamo di avere una tabella artcoli con chiave articoloid e chiave esterna
Categoryid,e dato Title

come faccio a tirare su un insieme di tutti gli articoli raggruppati per categoryID ma di ogni gruppo solo i primi elementi
è possibile farlo con una singola query
grazie ciauxx
Microsoft Most Valuable Professional
Re: query particolare
Andrea Montanari non è online. Ultima attività: 30/08/2008 1.32.03Andrea Montanari
Inserito il: 22 maggio 2008 14.05
contributi / Top Poster / Community manager / www.asql.biz / 922 messaggi dal 27 lug 2005 Istalla Microsoft Silverlight!
salve,
gmanunta81 wrote:
salve a tutti provo a postare qui il seguente commento ho dei problemi con una query sql cosi provo a chiedere aiuto qui supponiamo di avere una tabella artcoli con chiave articoloid e chiave esterna
Categoryid,e dato Title

come faccio a tirare su un insieme di tutti gli articoli raggruppati per categoryID ma di ogni gruppo solo i primi elementi
è possibile farlo con una singola query
grazie ciauxx

mica tanto chiaro..
vuoi un raggruppamento per [CategoryId] e, in base a tale raggruppamento vuoi la proiezione della sola 1ma riga relativa a questo raggruppamento? in questi termini ovviamente non si puo' parlare di raggruppamento, che prevede un comportamento ben diverso dal punto di vista semantico.. e c'e' anche un problema per la seconda parte, nel senso che non esiste una 1ma riga se non in base ad un determinato ordinamento..

comunque, puoi ottenere il tutto ad esempio con una subquery similarmente a SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Cat (
Id int NOT NULL PRIMARY KEY,
Name varchar(10)
);
CREATE TABLE dbo.Art (
Id int NOT NULL PRIMARY KEY,
CategoryId int NOT NULL
CONSTRAINT fk_art$has$category
FOREIGN KEY REFERENCES dbo.Cat(Id),
Name varchar(10)
);
GO
INSERT INTO dbo.Cat VALUES ( 1, 'Cat1' );
INSERT INTO dbo.Cat VALUES ( 2, 'Cat2' );
INSERT INTO dbo.Cat VALUES ( 3, 'Cat3' );
INSERT INTO dbo.Cat VALUES ( 4, 'Cat4' );

INSERT INTO dbo.Art VALUES ( 1, 1, 'Art1' );
INSERT INTO dbo.Art VALUES ( 2, 2, 'Art2.1' );
INSERT INTO dbo.Art VALUES ( 3, 2, 'Art2.2' );

INSERT INTO dbo.Art VALUES ( 4, 3, 'Art3.1' );
INSERT INTO dbo.Art VALUES ( 5, 3, 'Art3.2' );
INSERT INTO dbo.Art VALUES ( 6, 3, 'Art3.3' );
GO
SELECT c.Id, c.Name, (SELECT TOP (1) Name FROM dbo.Art WHERE CategoryId = c.Id ) AS [Articolo]
FROM dbo.Cat c;

GO
DROP TABLE dbo.Art, dbo.Cat;
--<--------
Id Name Articolo
---------
--------
----------
1 Cat1 Art1
2 Cat2 Art2.1
3 Cat3 Art3.1
4 Cat4 NULL

saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
Re: query particolare
gmanunta81 non è online. Ultima attività: 15/08/2008 11.24.19gmanunta81
Inserito il: 22 maggio 2008 16.08
56 messaggi dal 24 mar 2008 Istalla Microsoft Silverlight!
salve Andrea e grazie per la risposta molto completa
scusa per la poca chiarezza anche se la tua risposta ha fatto al caso mio
hai ragione mi è rimasta nella tastiera qualche parola

la query da te proposta va benissimo ma se devo tirare su le prime 3 righe
di ogni raggruppamento la query mi da errore

SELECT c.name,
(
SELECT top 3 cms_article.Title
From cms_article
where c.categoryID = cms_article.CategoryID
)

From cms_category c
Order by c.categoryID

per prime righe intendo le prime tre righe restituite dal sistema
senza nessun particolare ordinamento oppure in base alla data di pubblicazione dell articolo ma l'importante è che il sistema restituisca una cosa del genere

cat1,art1,title
cat1,art2,title
cat1,art5,title

cat2,art3,title
cat2,art4,title
cat2,art5,title

........

e cosi via come potrei
spero ora di aver espresso meglio i concetti prima poco chiari
comunque grazie è stata una bella lezione :)
Microsoft Most Valuable Professional
Re: query particolare
Andrea Montanari non è online. Ultima attività: 30/08/2008 1.32.03Andrea Montanari
Inserito il: 22 maggio 2008 18.15
contributi / Top Poster / Community manager / www.asql.biz / 922 messaggi dal 27 lug 2005 Istalla Microsoft Silverlight!
salve,
gmanunta81 wrote:

per prime righe intendo le prime tre righe restituite dal sistema senza nessun particolare ordinamento oppure in base alla data di pubblicazione dell articolo ma l'importante è che il sistema restituisca una cosa del genere


allora complichiamo le cose, giusto per divertirci

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Cat (
Id int NOT NULL PRIMARY KEY,
Name varchar(10)
);
CREATE TABLE dbo.Art (
Id int NOT NULL PRIMARY KEY,
CategoryId int NOT NULL
CONSTRAINT fk_art$has$category
FOREIGN KEY REFERENCES dbo.Cat(Id),
Name varchar(10)
);
GO
INSERT INTO dbo.Cat VALUES ( 1, 'Cat1' );
INSERT INTO dbo.Cat VALUES ( 2, 'Cat2' );
INSERT INTO dbo.Cat VALUES ( 3, 'Cat3' );
INSERT INTO dbo.Cat VALUES ( 4, 'Cat4' );

INSERT INTO dbo.Art VALUES ( 1, 1, 'Art1' );
INSERT INTO dbo.Art VALUES ( 2, 2, 'Art2.1' );
INSERT INTO dbo.Art VALUES ( 3, 2, 'Art2.2' );

INSERT INTO dbo.Art VALUES ( 4, 3, 'Art3.1' );
INSERT INTO dbo.Art VALUES ( 5, 3, 'Art3.2' );
INSERT INTO dbo.Art VALUES ( 6, 3, 'Art3.3' );
INSERT INTO dbo.Art VALUES ( 7, 3, 'Art3.4' );
GO
PRINT 'senza rimozione di categorie vuote';
SELECT c.Id, c.Name,
a.Id, a.Name
FROM dbo.Cat c
LEFT JOIN dbo.Art a
ON c.Id = a.CategoryId
AND a.Id IN
( SELECT TOP (3) Id FROM dbo.Art a2 WHERE a2.CategoryId = c.Id );
PRINT 'con rimozione di categorie vuote';
SELECT c.Id, c.Name,
a.Id, a.Name
FROM dbo.Cat c
JOIN dbo.Art a
ON c.Id = a.CategoryId
AND a.Id IN
( SELECT TOP (3) Id FROM dbo.Art a2 WHERE a2.CategoryId = c.Id );
GO
DROP TABLE dbo.Art, dbo.Cat;
--<-------
senza rimozione di categorie vuote
Id Name Id Name
---------
--------
---------
----------
1 Cat1 1 Art1
2 Cat2 2 Art2.1
2 Cat2 3 Art2.2
3 Cat3 4 Art3.1
3 Cat3 5 Art3.2
3 Cat3 6 Art3.3
4 Cat4 NULL NULL

con rimozione di categorie vuote
Id Name Id Name
---------
--------
---------
----------
1 Cat1 1 Art1
2 Cat2 2 Art2.1
2 Cat2 3 Art2.2
3 Cat3 4 Art3.1
3 Cat3 5 Art3.2
3 Cat3 6 Art3.3

questa soluzione e' molto elegante dal punto di vista semantico ma forse un po' costosa in termini di execution plan, ma e' compatibile anche con SQL Server 2000...

saluti

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
Re: query particolare
gmanunta81 non è online. Ultima attività: 15/08/2008 11.24.19gmanunta81
Inserito il: 23 maggio 2008 09.47
56 messaggi dal 24 mar 2008 Istalla Microsoft Silverlight!
grazie mille andrea
non so come tu abbia fatto
ma funziona
il mio problema era capire appunto come fare a prendere piu di tre elementi
e sopratutto come fare a ripetere tale operazione per tutte le categorie

ecco la versione da me adattata

SELECT c.categoryID, c.Name,
a.CategoryID, a.Title
FROM category c
JOIN article a
ON c.categoryID = a.CategoryId
AND a.articleID IN
( SELECT TOP 3 ArticleID FROM article a2 WHERE a2.CategoryId = c.categoryID )
Order by c.CategoryID

ancora grazie

Vai a:
Torna al forum |   Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.


fabrica - 1782 pt
vladimiro - 1731 pt
PeppeDotNet - 731 pt

Ultimi vincitori: PeppeDotNet, fabrica, vladimiro

Iscriviti anche tu e raccogli punti. Questo mese in palio VS 2008 + Windows Server 2008, ReShaper e 1 ebook!



COMMUNITY
ULTIMI MESSAGGI


IN EVIDENZA
MISC
Powered by .db Forums