15 messaggi dal 07 marzo 2007
Ciao a tutti,
ho la seguente query:
SELECT
tab_settori.idset,
tab_problematica.titolo,
tab_sottoprob.descrizione,
tab_sottoscheda.idscheda,
tab_sottoscheda.valore1,
tab_sottoscheda.idproblematica,
tab_problematica.idprob,
tab_schede.protocollonum,
tab_schede.idutente
FROM
tab_problematica
INNER JOIN tab_settori ON (tab_problematica.settore = tab_settori.idset)
INNER JOIN tab_sottoprob ON (tab_problematica.idprob = tab_sottoprob.idprob)
INNER JOIN tab_sottoscheda ON (tab_sottoprob.ID = tab_sottoscheda.id)
INNER JOIN tab_schede ON (tab_sottoscheda.idscheda = tab_schede.idscheda)
WHERE
(tab_settori.idset=38)
ORDER BY tab_schede.idscheda DESC

Il risultato è che ci sono dei record che hanno valori tab_schede.idscheda uguali.

Vorrei modificare la query in modo da avere solo i record con tab_schede.idscheda differente.
Come fare?

Grazie per l'aiuto
Modificato da depifano il 24 ottobre 2008 14.59 -
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
FROM
tab_problematica
INNER JOIN tab_settori ON (tab_problematica.settore =
tab_settori.idset) INNER JOIN tab_sottoprob ON
(tab_problematica.idprob = tab_sottoprob.idpro
INNER JOIN tab_sottoscheda ON (tab_sottoprob.ID = tab_sottoscheda.id) INNER JOIN tab_schede ON (tab_sottoscheda.idscheda =
tab_schede.idscheda) WHERE
(tab_settori.idset=3
ORDER BY tab_schede.idscheda DESC

Il risultato è che ci sono dei record che hanno valori
tab_schede.idscheda uguali.

Vorrei modificare la query in modo da avere solo i record con tab_schede.idscheda differente.
Come fare?

la popolazione di tab_schede a quanto pare e' in un qualche modo "duplicata", ed ovviamente vengono ritornate piu' righe dal relativo workingset.. devi quindi "migliorare" la popolazione, eliminando i duplicati, ovvero proiettare un "distinct" di quel rowset escludendo i duplicati.. per la seconda tipologia devi anche scegliere un criterio di estrazione o esclusione.. probabilmente ti conviene usare una subquery tipo INNER JOIN
(SELECT <col_list> FROM tab_schede WHERE filtro_di_inclusione ) AS tab_schede ON (tab_sottoscheda.idscheda = tab_schede.idscheda) WHERE
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
15 messaggi dal 07 marzo 2007
Ciao

CREATE TABLE [dbo].[tab_schede] (
[idscheda] numeric(18, 0) IDENTITY(1, 1) NOT NULL,
[numerotelefonate] numeric(18, 0),
CONSTRAINT [PK_tab_schede] PRIMARY KEY CLUSTERED ([idscheda])
)
ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO

CREATE TABLE [dbo].[tab_settori] (
[idset] numeric(18, 0) IDENTITY(1, 1) NOT NULL,
[titolo] varchar(100) COLLATE Latin1_General_CI_AS,
[areapit] varchar(50) COLLATE Latin1_General_CI_AS,
CONSTRAINT [PK_tab_settori1] PRIMARY KEY CLUSTERED ([idset])
)
ON [PRIMARY]
GO

CREATE TABLE [dbo].[tab_problematica] (
[idprob] numeric(18, 0) IDENTITY(1, 1) NOT NULL,
[titolo] varchar(100) COLLATE Latin1_General_CI_AS,
[settore] numeric(18, 0)
)
ON [PRIMARY]
GO

CREATE TABLE [dbo].[tab_sottoscheda] (
[id] numeric(18, 0) IDENTITY(1, 1) NOT NULL,
[idscheda] numeric(18, 0),
[idproblematica] numeric(18, 0),
[valore1] varchar(1000) COLLATE Latin1_General_CI_AS CONSTRAINT [DF_tab_sottoscheda_valore1] DEFAULT 0,
[valore2] varchar(1000) COLLATE Latin1_General_CI_AS CONSTRAINT [DF_tab_sottoscheda_valore2] DEFAULT 0,
[valore3] varchar(1000) COLLATE Latin1_General_CI_AS CONSTRAINT [DF_tab_sottoscheda_valore3] DEFAULT 0,
[valore4] varchar(1000) COLLATE Latin1_General_CI_AS CONSTRAINT [DF_tab_sottoscheda_valore4] DEFAULT 0,
[valore5] varchar(1000) COLLATE Latin1_General_CI_AS CONSTRAINT [DF_tab_sottoscheda_valore5] DEFAULT 0,
CONSTRAINT [PK_tab_sottoscheda] PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

Devo estrarre gli idscheda da tab_sottoscheda non duplicati ma solamente uno che li rappresenta.
Ho inserito sia sql che dati estratti con la mia query.

ididprobidsetidscheda
148412038499
148512138499
148712038500
148812138500
149012038501
149112038502
149212138502
149412038503
149512138503
149712038504
149812138504
150012038505
150112138505

Non ho mai usato le sottoquery, puoi farmi un esempio?
Grazie
Modificato da depifano il 24 ottobre 2008 19.06 -
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
depifano wrote:

Devo estrarre gli idscheda da tab_sottoscheda non duplicati ma solamente uno che li rappresenta.

prima indicavi
Il risultato è che ci sono dei record che hanno valori tab_schede.idscheda uguali.


deciditi

ripeto, devi decidere un criterio di restituzione di una singola riga per tab_schede (o tab_sottoschede)... sia esso "casuale" (cosa non tecnicamente possibile), la "prima", "l'ultima" o quant'altro..
direi quindi,
(SELECT DISTINCT idscheda FROM tab_scheda) AS tab_scheda
che poi potrai mettere in join con il resto, quindi probabilmente FROM
tab_problematica
INNER JOIN tab_settori ON (tab_problematica.settore =
tab_settori.idset) INNER JOIN tab_sottoprob ON
(tab_problematica.idprob = tab_sottoprob.idpro
INNER JOIN tab_sottoscheda ON (tab_sottoprob.ID = tab_sottoscheda.id) INNER JOIN
(SELECT DISTINCT idscheda FROM tab_scheda) AS tab_scheda ON (tab_sottoscheda.idscheda = tab_schede.idscheda)
WHERE
(tab_settori.idset=3
ORDER BY tab_schede.idscheda DESC

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
1.976 messaggi dal 27 luglio 2005
Contributi
scusa,
ho guardato solo ora la proiezione iniziale..
hai anche da restituire
tab_schede.protocollonum,
tab_schede.idutente

il discorso non cambia solo che non va piu' bene il
(SELECT DISTINCT idscheda FROM tab_scheda) AS tab_scheda
in quanto a te servono anche altre 2 colonne almeno..
quindi devi "divertirti" ad isolare la singola riga che ti interessa... definisciti il criterio di estrazione e "procedi"..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

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.