Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите "облегчить" условие  [new]
Demer
Member

Откуда:
Сообщений: 82
Есть условие в WERE, условно напишу его так:
WHERE
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL
  AND z IS NOT NULL)
OR
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL
  AND z IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL 
  AND z IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND z IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3))

Как можно сократить это условие?
20 ноя 13, 11:59    [15160259]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Glory
Member

Откуда:
Сообщений: 104751
Demer
Как можно сократить это условие?

Ну так, например
WHERE NOT EXISTS (SELECT 1 FROM t1)
20 ноя 13, 12:00    [15160269]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Demer
Member

Откуда:
Сообщений: 82
Не правильно написал...
Вот правильно:
WHERE
(NOT EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL
  AND z IS NOT NULL)
OR
(NOT EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL
  AND z IS NOT NULL)
(EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL 
  AND z IS NOT NULL)
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL)
(EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL)
(EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND z IS NOT NULL)
(EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3))
20 ноя 13, 12:03    [15160315]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Demer
Не правильно написал...
Вот правильно:

синтаксически всё равно неправильно
20 ноя 13, 12:05    [15160349]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Demer
Member

Откуда:
Сообщений: 82
Гость333
Demer
Не правильно написал...
Вот правильно:

синтаксически всё равно неправильно

А как правильно?
20 ноя 13, 12:07    [15160375]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Demer
Member

Откуда:
Сообщений: 82
Гость333
синтаксически всё равно неправильно


Ну да... )))
Вот:
WHERE
(NOT EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL
  AND z IS NOT NULL)
OR
(NOT EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL 
  AND y IS NOT NULL)
OR
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL
  AND z IS NOT NULL)
OR
(EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL 
  AND z IS NOT NULL)
OR
(NOT EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND x IS NOT NULL)
OR
(EXISTS (SELECT 1 FROM t1) 
  AND NOT EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3) 
  AND y IS NOT NULL)
OR
(EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND NOT EXISTS (SELECT 1 FROM t3) 
  AND z IS NOT NULL)
OR
(EXISTS (SELECT 1 FROM t1) 
  AND EXISTS(SELECT 1 FROM t2) 
  AND EXISTS (SELECT 1 FROM t3))
20 ноя 13, 12:09    [15160398]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Exproment
Member

Откуда:
Сообщений: 416
Demer,
x,y,z - переменные ? Если да, то можно использовать динамику или разделить логику на if/else.
20 ноя 13, 12:10    [15160412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Demer,

Синтаксически правильно — это когда запрос "SELECT 1 WHERE <Ваши условия>" будет выдавать не пачку синтаксических ошибок вида "Incorrect syntax near the keyword 'NOT'", а ошибки разрешения имён "Invalid object name 't1'" или "Invalid column name 'x'".
20 ноя 13, 12:11    [15160430]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Demer
Member

Откуда:
Сообщений: 82
Exproment
Demer,
x,y,z - переменные ? Если да, то можно использовать динамику или разделить логику на if/else.


x,y,z - поля таблицы
SELECT x, y, z FROM Table WHERE ...
20 ноя 13, 12:11    [15160438]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Exproment
Member

Откуда:
Сообщений: 416
Demer, блин давайте сюда реальный селект с подготовленными тестовыми данными, который можно без ошибок запустить у себя. И тогда вам помогут.
20 ноя 13, 14:08    [15161577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите "облегчить" условие  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Demer вы наверно троллите. Ибо понятно пишется очень просто.
Вот как надо писать:
WITH
 [t1](X) AS (SELECT 1)
,[t2](X) AS (SELECT 1)
,[t3](X) AS (SELECT 1)
SELECT	*
FROM	(VALUES (1,1,1))A(X,Y,Z)
--------------------------------
WHERE (	NOT Exists(SELECT 1 FROM t1) AND X IS NOT NULL
AND	NOT Exists(SELECT 1 FROM t2) AND Y IS NOT NULL
AND	NOT Exists(SELECT 1 FROM t3) AND Z IS NOT NULL
) OR (	NOT Exists(SELECT 1 FROM t1) AND X IS NOT NULL
AND	NOT Exists(SELECT 1 FROM t2) AND Y IS NOT NULL
AND	    Exists(SELECT 1 FROM t3)
) OR (	NOT Exists(SELECT 1 FROM t1) AND X IS NOT NULL
AND	    Exists(SELECT 1 FROM t2)
AND	NOT Exists(SELECT 1 FROM t3) AND Z IS NOT NULL
) OR (	    Exists(SELECT 1 FROM t1)
AND	NOT Exists(SELECT 1 FROM t2) AND Y IS NOT NULL
AND	NOT Exists(SELECT 1 FROM t3) AND Z IS NOT NULL
) OR (	NOT Exists(SELECT 1 FROM t1) AND X IS NOT NULL
AND	    Exists(SELECT 1 FROM t2)
AND	    Exists(SELECT 1 FROM t3)
) OR (	    Exists(SELECT 1 FROM t1)
AND	NOT Exists(SELECT 1 FROM t2) AND Y IS NOT NULL
AND	    Exists(SELECT 1 FROM t3)
) OR (	    Exists(SELECT 1 FROM t1)
AND	    Exists(SELECT 1 FROM t2)
AND	NOT Exists(SELECT 1 FROM t3) AND Z IS NOT NULL
) OR (	    Exists(SELECT 1 FROM t1)
AND	    Exists(SELECT 1 FROM t2)
AND	    Exists(SELECT 1 FROM t3)
)
Но главное можно словами написать ещё проще: NULL-инг переменной должен соответствовать соответсвующему Exist.

Вы что не умеете приводить такие выражения к нормальным формам? (дизъюнктивным/конъюнктивным)
Это же в школе изучают, не то что в институте.

WITH
 [t1](X) AS (SELECT 1)
,[t2](X) AS (SELECT 1)
,[t3](X) AS (SELECT 1)
SELECT	*
FROM	(VALUES (1,1,1))A(X,Y,Z)
--------------------------------
WHERE	(Exists(SELECT 1 FROM t1) OR X IS NOT NULL)
AND	(Exists(SELECT 1 FROM t2) OR Y IS NOT NULL)
AND	(Exists(SELECT 1 FROM t3) OR Z IS NOT NULL)

А заодно поизучайте простые вещи, как APPLY и EXCEPT. Есть чуйка что тут может проявится (ибо Exists-ы вы привели урезанные).
20 ноя 13, 18:21    [15163935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить