SQL-запрос для фильтрации по двум полям в комбинации - PullRequest
5 голосов
/ 29 февраля 2012
ArticleNumber   Company Storage
 01-01227       12      2
 01-01227       2       1  'filtered by company/storage in combination
 01-01227       5       1
 01-01227       12      1  'filtered by company/storage in combination
 01-44444       5       4  'filtered by not match the articlenumber

Я хочу отфильтровать, чтобы строки, содержащие (company = 12 и storage = 1) и (company = 2 и storage = 1), были отфильтрованы изнабор результатов, а также фильтр на articlenr.

Это то, что я придумал, но уверен, что должен быть более простой способ сделать этот запрос?

SELECT  * FROM    MyTable 
where 
    (Company=2 and Storage<>1 and ArticleNumber='01-01227') 
or 
    (Company=12   and Storage<>1 and ArticleNumber='01-01227') 
or
    (Company<>2 and Company<>12 and ArticleNumber='01-01227') 

Результат I 'м после:

ArticleNumber   Company Storage
  01-01227      12      2
  01-01227      5       1

Ответы [ 5 ]

1 голос
/ 29 февраля 2012
SELECT * FROM MyTable
WHERE ArticleNumber='01-01227'
AND (Company NOT IN (2,12) OR Storage <> 1)
0 голосов
/ 29 февраля 2012

Это вернет то, что вы ищете:

select * from t
where articleNumber = '01-01227' and (
  (company != 12 or storage != 1) and
  (company !=  2 or storage != 1)
)

Результат:

ARTICLENUMBER   COMPANY STORAGE
01-01227        12      2
01-01227        5       1

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

0 голосов
/ 29 февраля 2012
SELECT * FROM MyTable 
WHERE 
    NOT (Company=12 and Storage=1) 
AND 
    NOT (Company=5 and Storage=1)
AND
    ArticleNumber='01-01227'

или даже лучше

SELECT * FROM MyTable 
WHERE 
    NOT ((Company=12 OR Company=5) AND Storage=1)
AND
    ArticleNumber='01-01227'
0 голосов
/ 29 февраля 2012

Что-то в этом роде?

SELECT  * FROM    MyTable 
where 
    ArticleNumber='01-01227'
AND
    (Company IN (2,12) AND Storage <> 1
    OR
    Company NOT IN (2,12)
    )
0 голосов
/ 29 февраля 2012

Один из возможных способов сделать это проще - создать таблицу с именем, скажем, company_storage_exclude со столбцами Company и Storage. Затем просто заполните эти значения парами Company и Storage, которые вы хотите исключить, и затем вы можете сделать:

select *
from MyTable
where (Company,Storage) not in (select Company,Storage from company_storage_exclude)
and ArticleNumber='01-01227';

или

select a.*
from MyTable a
left join company_storage_exclude b
on (a.Company=b.Company and a.Storage=b.Storage)
where b.Company is null and b.Storage is null
and ArticleNumber='01-01227';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...