как использовать LIKE вместо IN с несколькими значениями? - PullRequest
0 голосов
/ 03 октября 2019

Я хочу заменить In на Like, чтобы запрос работал.

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')

Сравнение, которое я хотел бы сделать с LIKE, в противном случае запрос не работает, подзапрос возвращает более одного значения иэто правильно, но если я использую Like вместо IN, у меня появляется это сообщение об ошибке:

Запрос возвращает более 1 значения

Ответы [ 3 ]

3 голосов
/ 03 октября 2019

Использование LIKE для подзапроса, который возвращает несколько записей, не будет работать. Решением было бы преобразование условия IN в состояние EXISTS, например:

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 + '%'
)
0 голосов
/ 03 октября 2019

Использование EXISTS:

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
       )

Я предполагаю, что логика, которую вы на самом деле хотите использовать, использует подстановочные знаки:

                CLASS_ART.COD_CAT LIKE CONCAT('%', M.COD_CAT, '%')

Если это так, то это указывает на проблему с моделью данных. Почему два столбца с одинаковым именем (COD_CAT) необходимо объединить, используя LIKE вместо =.

0 голосов
/ 03 октября 2019

Лайк нужно сравнивать с одной строкой, поэтому вам нужно установить все свои идентификаторы в одной строке. Вы можете сделать это, используя предложение for xml.

(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(''))

Теперь я бы разделил ваши идентификаторы запятыми, чтобы вы не находили ложных срабатываний, и сравнивал бы их, как.

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 + ',%'

Это сработает, и у вас будетпоменял оператор IN на оператор LIKE, но я не вижу в этом смысла, его производительность будет хуже, чем у исходного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...