2016-08-09 2 views
0

Я использую этот запрос для получения платежей от клиента, все еще не оплаченного. Поэтому мне нужно исключить все виды в разделе where. Я пробовал с <> и! = И не нравится, но он показывает мне все платежи, а также те, которые я исключил в разделе where. Вы видите то, чего я не вижу?Где странные результаты

SELECT td= CODCLIFOR,  '', 
      td= DSCCONTO1,  '', 
      td= ANAGRAFICACF.TELEX,  '', 
      td= NUMDOC,  '', 
      td= NUMSCAD,  '', 
      td= CONVERT (VARCHAR(30),DATASCADENZA,105),  '', 
      td= '€ ' + REPLACE(CONVERT(varchar, CAST(IMPORTOSCLIT AS money), 105),',','.') ,  '', 
      td= TIPIEFFETTI.DESCRIZIONE,ESITO 
      FROM dbo.TABSCADENZE 
      INNER JOIN dbo.ANAGRAFICACF ON CODCLIFOR = CODCONTO 
      INNER JOIN dbo.TIPIEFFETTI ON TIPOEFFETTO = EFFETTO 
      INNER JOIN dbo.BANCAAPPCF ON CODCLIFOR = BANCAAPPCF.CODCONTO AND BANCAAPPCF.CODICE = TABSCADENZE.BANCAAPPOGGIO 
      INNER JOIN dbo.ANAGRAFICABANCHE ON BANCAINC = CODBANCA 
      WHERE (TABSCADENZE.TIPOEFFETTO NOT LIKE '%2%' OR TABSCADENZE.TIPOEFFETTO NOT LIKE '%10%') AND (TABSCADENZE.ESITO NOT LIKE '%1%' OR TABSCADENZE.ESITO NOT LIKE '%2%' OR TABSCADENZE.ESITO NOT LIKE '%4%') AND CODCLIFOR LIKE '%C%' 
      ORDER BY CODCLIFOR DESC 

Thank you!

+0

Пожалуйста, отредактируйте [править], чтобы указать образцы данных и результат, который вы хотите получить из этих данных. Единственное, что ясно из вашего вопроса, - это то, что у вас очень плохой дизайн базы данных. –

ответ

0

Это комбинация ORs и ANDs и использование NOT, которые являются сбивчивыми и неправильными.

Не читайте их как английский, потому что именно поэтому большинство людей неправильно думают, что они закодировали правильную логику.

Если вы используете OR с NOT, то вам нужно сделать обратное и заменить OR на AND. В противном случае один будет терпеть неудачу, а другой пройдет, и, следовательно, все WHERE станет TRUE, поэтому все ваши записи показываются.

Попробуйте это ...

WHERE 
    TABSCADENZE.TIPOEFFETTO NOT LIKE '%2%' 
AND TABSCADENZE.TIPOEFFETTO NOT LIKE '%10%' 
AND TABSCADENZE.ESITO NOT LIKE '%1%' 
AND TABSCADENZE.ESITO NOT LIKE '%2%' 
AND TABSCADENZE.ESITO NOT LIKE '%4%' 
AND CODCLIFOR LIKE '%C%' 

Посмотрите на это, который похож ...

How do I add multiple "NOT LIKE '%?%' in the WHERE clause of sqlite3 in python code?

+1

mmm Я не уверен, что положил только И это правильный путь. Теперь у меня нет никакого результата. «ESITO» может быть или 1 или 2 или 4 и не может быть в то же время 3 значениями, поэтому я думаю, что результат, как и этот, всегда пуст. И то же самое для 'TIPOEFFETTO' – BigBlack

0

Ok Я нашел решение. Я использовал Not In с подзапросами. Теперь результаты хорошие. это код, если кому-то это необходимо:

WHERE DATASCADENZA BETWEEN DATEADD(DAY, -30, GETDATE()) AND DATEADD(DAY, -15, GETDATE()) AND CODCLIFOR LIKE '%C%' 
       AND TIPOEFFETTO NOT IN (SELECT DISTINCT TIPOEFFETTO FROM dbo.TABSCADENZE WHERE TIPOEFFETTO = 10 OR TIPOEFFETTO = 2) AND ESITO NOT IN (SELECT DISTINCT ESITO FROM dbo.TABSCADENZE WHERE ESITO = 1 OR ESITO = 2 OR ESITO = 4) 

Благодарим за помощь!

+0

Обычно это хороший общность сообщества, чтобы дать ответы на вопросы, даже если они не были на 100% достигнуты вами. – Fandango68

Смежные вопросы