Je souhaite remplacer In par Like pour que la requête fonctionne.
SELECT 1 AS coddit, COD_CAT AS cam_cod, DES_CAT AS cam_desc, LIVELLO_CAT AS livello, COD_CAT_PADRE AS cat_padre, COD_L1, COD_L2, COD_L3, COD_L4, COD_L5, COD_L6 FROM dbo.CLASS_ART WHERE 1=1 AND TIPO_CLASS = 16 --B2B AND LIVELLO_CAT = '0' AND COD_CAT IN (SELECT DISTINCT CAT_MERCE.COD_CAT FROM ART_LIST_PREZZI INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002')
La comparaison que je voudrais faire avec LIKE sinon la requête ne fonctionne pas bien la sous-requête renvoie plus d'une valeur et elle est correcte mais si j'utilise Like au lieu de IN, j'ai ce message d'erreur:
La requête renvoie plus d'une valeur
3 Réponses :
L'utilisation de LIKE
contre une sous-requête qui renvoie plusieurs enregistrements ne fonctionnera pas. Une solution serait de transformer la condition IN
en une condition EXISTS
, comme:
and exists ( select 1 from ART_LIST_PREZZI inner join ART_ANA on ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART inner join CAT_MERCE on ART_ANA.COD_CAT = CAT_MERCE.COD_CAT and ART_LIST_PREZZI.COD_LIST = 'EXPORT_002' where COD_CAT like '%' + CAT_MERCE.COD_CAT + '%' )
Comme doit être comparé à une seule chaîne, vous devez donc définir tous vos identifiants sur une seule chaîne. Vous pouvez le faire en utilisant la clause for xml.
AND (SELECT DISTINCT ',' + CAST(CAT_MERCE.COD_CAT AS VARCHAR(32)) + ',' FROM ART_LIST_PREZZI INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002' FOR XML PATH('')) LIKE '%,' + COD_CAT + ',%'
Maintenant, je délimiterais vos identifiants par des virgules, afin que vous ne trouviez pas de faux positifs, et je les comparerais en utilisant like.
(SELECT DISTINCT CAST(CAT_MERCE.COD_CAT AS VARCHAR(32)) FROM ART_LIST_PREZZI INNER JOIN ART_ANA ON ART_LIST_PREZZI.COD_ART = ART_ANA.COD_ART INNER JOIN CAT_MERCE ON ART_ANA.COD_CAT = CAT_MERCE.COD_CAT AND ART_LIST_PREZZI.COD_LIST = 'EXPORT_002' FOR XML PATH(''))
Cela fonctionnerait, et vous auriez changé votre opérateur IN avec un opérateur LIKE, mais je n'en vois pas l'intérêt, ses performances seraient pires que votre requête d'origine.
Utilisez EXISTS
:
CLASS_ART.COD_CAT LIKE CONCAT('%', M.COD_CAT, '%')
Je suppose que la logique que vous voulez réellement utilise des caractères génériques:
EXISTS (SELECT 1 FROM ART_LIST_PREZZI LP JOIN ART_ANA A ON LP.COD_ART = A.COD_ART JOIN CAT_MERCE M ON A.COD_CAT = M.COD_CAT AND LP.COD_LIST = 'EXPORT_002' AND CLASS_ART.COD_CAT LIKE M.COD_CAT )
Si tel est le cas, cela suggère un problème avec le modèle de données. Pourquoi deux colonnes portant le même nom ( COD_CAT
) doivent-elles être jointes en utilisant LIKE
au lieu de =
.
vous êtes sûr que la requête est à l'origine de cette erreur? comme
COD_CAT IN (sélectionnez DISTINCT CAT_MERCE.COD_CAT à partir de ART_LIST_PREZZI ..)
devrait fonctionner correctement.la requête fonctionne mais je veux supprimer In et mettre Like
... vous avez probablement également étiqueté le mauvais SGBDR. Comme l'utilisation de
dbo
suggère probablement que vous utilisez SQL Server (MSSQL) et non MySQL.Une "sous-requête IN" peut renvoyer plusieurs lignes.
Des vues impliquées?
pour la comparaison j'ai besoin de LIKE au lieu de IN
Voir Pourquoi Dois-je fournir un exemple minimal reproductible pour une requête SQL très simple? alors nous pouvons commencer à donner des réponses solides.
vérifiez ici: stackoverflow.com/ questions / 1865353 /…