1 messaggio dal 11 aprile 2019
Salve a tutti. Anche se il linguaggio è asp classic la query è sql quindi credo di non sbagliare nel postare qui, giusto?

Ho un problema con una query che dovrebbe estrapolare un numero definito di records, precisamente 6 records.

le tabelle in questione sono rispettivamente una con i records dei prodotti ed una con i quantitativi.

La tabella prodotti si chiama AR con riferimento identificativo del prodotto CD_AR.
La tabella delle giacenze si chiama MGGiacDisp con riferimento identificativo del prodotto CD_AR ed una campo valore QuantitaDimm.

Devo ricavare una query di prodotti dove siamo presenti solo quelli con giacenza pari a 1 e superiore.

io ho eseguito questo tipo di query ma ovviamente non restituisce nulla e va in errore

select top 6 * FROM AR where CD_AR=(select * FROM MGGiacDisp where CD_AR='& CD_AR &' and QuantitaDimm=>1)

Modificato da gerry webmaster il 11 aprile 2019 14:29 -
825 messaggi dal 11 febbraio 2013
Scusa non puoi fare un join sul campo del prodotto e filtrare le quantità?
salve.
non so che rdbms tu stia usando, ma comunque il consiglio di jjchuck resta valido... personalmente utilizzerei un filtro sulla quantita' per l'estrazione degli articoli e quindi procedere alla proiezione in join sulla tabella prodotti...
sicuramente i "max 6" articoli "fissi" devono essere recuperati secondo un criterio specifico, che tu non hai indicato, che nella tua query e' quindi un risultato tendenzialmente casuale... direi che, secondo il piano di esecuzione, quindi, a seconda dello "scan" sui dati effettuato, sia dipendente dal modo "fisico" di come le righe vengono recuperate dalla base dati...
se verra' utilizzato un table scan, sara' utilizzato l'ordine della primary key, se invece saranno utilizzati dei lookup su indici diversi, le righe restituite dipenderanno da questi ordinamenti...

usando SQL Server, personalmente utilizzerei una funzione di windowing, ad esempio per estrarre i "max 6 articoli fissi" ad esempio ordinandoli per quantita decrescente... quindi, nel caso di
10 articoli che soddisfano QuantitaDimm >= 1, i 6 che verranno estratti saranno i 6 con maggiore quantita', ma questa ovviamente e' una mia speculazione giusto per rendere l'idea...
quindi, trivialmente:
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.AR (
  CD_AR int
  );
CREATE TABLE dbo.MGGiacDisp (
  CD_AR int,
  QuantitaDimm int
  );
GO
INSERT INTO dbo.AR
  VALUES  ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 ), ( 10 ), ( 11 );
INSERT INTO dbo.MGGiacDisp
  VALUES  ( 1, 3 ),
      ( 2, 0 ),
      ( 3, 2 ),
      ( 4, 1 ),
      ( 5, 0 ),
      ( 6, 4 ),
      ( 7, 0 ),
      ( 8, 1 ),
      ( 9, 5 ),
      ( 10, 1 );
GO
PRINT 'tutti quelli che soddisfano QuantitaDimm > = 1';
SELECT ar.CD_AR, ROW_NUMBER() OVER (ORDER BY mg.QuantitaDimm DESC) AS [r]
    FROM dbo.AR ar
      JOIN dbo.MGGiacDisp mg ON mg.CD_AR = ar.CD_AR
    WHERE mg.QuantitaDimm > = 1;

PRINT 'estrazione dei "primi 6" in base ad ordinamento per QuantitaDimm decrescente';
WITH cteAR AS (
  SELECT ar.CD_AR, ROW_NUMBER() OVER (ORDER BY mg.QuantitaDimm DESC) AS [r]
    FROM dbo.AR ar
      JOIN dbo.MGGiacDisp mg ON mg.CD_AR = ar.CD_AR
    WHERE mg.QuantitaDimm > = 1
  )
  SELECT c.CD_AR
    , mg.QuantitaDimm
    FROM cteAR c
      JOIN dbo.MGGiacDisp mg ON mg.CD_AR = c.CD_AR
    WHERE c.r <= 6
    ORDER BY c.r
GO
DROP TABLE dbo.AR, dbo.MGGiacDisp;


ci sono 11 articoli, dei quali 7 soddisfano la specifica...

la funzione di windowing
 
    ... , ROW_NUMBER() OVER (ORDER BY mg.QuantitaDimm DESC) AS [r] 

provvede ad ordinare in senso decrescente per mg.QuantitaDimm assegnando un'ordinalita' progressiva... l'estrazione finale, nel filtro di WHERE, estrae massimo "6 righe" come dall'ordinalita' prima ottenuta...
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.