Operatore di confronto NOT LIKE con sottoquery

martedì 17 aprile 2007 - 09.36

denis.basei Profilo | Senior Member

Salve a tutti, quest'oggi mi sto imbattendo in questo problema: ho una tabella appartenente al db Asa di SQL 2000 di nome Asa_Semc0380 nella quale devo selezionare un recordset in cui Lista, Consegna e TipoCollo hanno un carto valore, e fin qui tutto facile, e dove il valore di CodiceArticolo non deve essere "simile" al valore del medesimo campo della tabella CodArt_NoKit del db Produz. In quest'ultima tabella i codici sono scritti usando i caratteri speciali SQL. Allego anche una esemplificazione del caso e dell'errore. Qualcuno mi sa suggerire se posso ottenere ciò che vorrei con una query SQL?

Grazie.

Denis

lbenaglia Profilo | Guru

>dove il valore di CodiceArticolo non deve essere "simile" al
>valore del medesimo campo della tabella CodArt_NoKit del db Produz.
>In quest'ultima tabella i codici sono scritti usando i caratteri
>speciali SQL. Allego anche una esemplificazione del caso e dell'errore.
>Qualcuno mi sa suggerire se posso ottenere ciò che vorrei con
>una query SQL?

Ciao Denis,

l'errore è molto chiaro: la subquery restituisce n righe mentre l'operatore LIKE si aspetta un pattern (una espressione stringa).

Prepara uno script contenente i comandi DDL delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set che desideri ottenere a partire da quei dati.

>Grazie.
Prego.

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

denis.basei Profilo | Senior Member

Allego lo script.
Ciò che vorrei ottenere è una query di selezione che mi restituisca il conteggio dei records di Asa_Semc0380_Copia dove CodiceArticolo non assomiglia al medesimo campo in CodArt_NoKit. Nel caso dell'esempio dovrebbe restituire 1.

Ciao e grazie ancora per la rapidità nella risposta!

lbenaglia Profilo | Guru

>Allego lo script.

Mi sembra di capire che i valori della colonna CodiceArticolo della tabella dbo.CodArt_NoKit abbiano i primi due caratteri valorizzati con un underscore "__", quindi potresti effettuare una sostituzione dei corrispondenti valori in dbo.Asa_Semco380_Copia in modo da poter mettere in JOIN le due tabelle.
A tale scopo risulta molto utile la funzione STUFF che "Deletes a specified length of characters and inserts another set of characters at a specified starting point":

USE tempdb; GO CREATE TABLE dbo.Asa_Semco380_Copia ( TipoCollo decimal(2, 0) NULL, Lista char (4) NULL, Consegna decimal(5, 0) NULL, TabellaOrdine decimal(3, 0) NULL, NumeroOrdine decimal(6, 0) NULL, RigaOrdine decimal(3, 0) NULL, CodiceArticolo char (15) NULL, ); CREATE TABLE dbo.CodArt_NoKit ( CodiceArticolo varchar (15) NOT NULL, Descrizione varchar (61) NULL ); INSERT INTO dbo.Asa_Semco380_Copia VALUES(0, '094', 1, 101, 1875, 5, 'B3B1C45D'); INSERT INTO dbo.Asa_Semco380_Copia VALUES(0, '094', 1, 101, 1875, 10, 'B3PE745D'); INSERT INTO dbo.CodArt_NoKit VALUES('__B1C45D', 'ART.DI PROVA2'); /* Ciò che vorrei ottenere è una query di selezione che mi restituisca il conteggio dei records di Asa_Semc0380_Copia dove CodiceArticolo non assomiglia al medesimo campo in CodArt_NoKit. Nel caso dell'esempio dovrebbe restituire 1. */ SELECT COUNT(*) AS Conteggio FROM dbo.Asa_Semco380_Copia AS A JOIN dbo.CodArt_NoKit AS C ON STUFF(A.CodiceArticolo, 1, 2, '__') = C.CodiceArticolo; /* Output: Conteggio ----------- 1 (1 row(s) affected) */ DROP TABLE dbo.Asa_Semco380_Copia, dbo.CodArt_NoKit;

Per maggiori dettagli ti rimando ai Books Online:

"STUFF (Transact-SQL)"
http://msdn2.microsoft.com/en-us/library/ms188043.aspx

>Ciao e grazie ancora per la rapidità nella risposta!
Prego.

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

denis.basei Profilo | Senior Member

Grazie,

hai una risposta a tutto! Devo dire che l'iscrizione a questo sito vale veramente la pena...
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5