Вложенность скобок в условиях при использовании AddWhere

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Закрыто
Akella
Сообщения: 217
Зарегистрирован: Пн 02 апр 2012 14:41

Вложенность скобок в условиях при использовании AddWhere

Сообщение Akella » Пн 25 июн 2012 08:49

Вот запрос

Код: Выделить всё

SELECT distinct 
     a.id
     , a.txt
     , a.rub_id
     , a.rub
     , a.vid
     , a.id_obj_site
     , a.id_user_ekr
     , a.Deleted
     , a.paid
     , a.id_team
     , a.gdn
	 , a.rub_code

FROM
  kvartal_prem.ads a
left JOIN datas d
ON (d.id_ads = a.id)
Затем я строю where кляузу:

Код: Выделить всё

  with fUniQuery do
  begin
    Close;
    DeleteWhere;
    KeyFields := 'id';

    //если выбрана какая-то бригада(ы)
    if team_list <> '' then
      AddWhere('a.id_team in (' + team_list + ')');

    //активные
    AddWhere('a.Deleted = 0');

    //отключаем ЖиДН (берем только в Премьер)
    AddWhere('a.gdn = 0');

    AddWhere('d.date_out = :dt_out');
    ParamByName('dt_out').AsDate := date_out;

    ShowMessage(SQL.Text);
  end;//with
получается вот такой запрос, где много лишних скобок + вложенность условий:

Код: Выделить всё

SELECT distinct 
     a.id
     , a.txt
     , a.rub_id
     , a.rub
     , a.vid
     , a.id_obj_site
     , a.id_user_ekr
     , a.Deleted
     , a.paid
     , a.id_team
     , a.gdn
	 , a.rub_code

FROM
  kvartal_prem.ads a
left JOIN datas d
ON (d.id_ads = a.id)
WHERE (((a.id_team in (12,11,5,9,328)) AND a.Deleted = 0) AND a.gdn = 0) AND d.date_out = :dt_out 


разве не вот такой запрос должен получиться?

Код: Выделить всё

WHERE a.id_team in (827,21,17,15) AND a.Deleted = 0 AND a.gdn = 0 AND d.date_out = :dt_out 
или

Код: Выделить всё

WHERE (a.id_team in (827,21,17,15)) AND (a.Deleted = 0) AND (a.gdn = 0) (AND d.date_out = :dt_out )
UniDAC 4.1.6 for Delphi XE2

bork
Devart Team
Сообщения: 16
Зарегистрирован: Вт 06 сен 2011 09:22

Re: Вложенность скобок в условиях при использовании AddWhere

Сообщение bork » Пн 25 июн 2012 13:24

Добрый день

(A and B) and C = A and (B and C) = A and B and C - это можно прочесть в разделе Булева алгебра из Дискретной математики. А следовательно условия, которые возвращает UniDAC и те, которые вы ожидали получить, - абсолютно тождественны (возвращают одинаковый результат).

Чтобы уменьшить вложенность скобок, нам необходимо значительно усложнить существующий парсинг SQL запросов, что негативно скажется на быстродействии UniDAC.

На данный момент мы не видим причин исправлять AddWhere, чтобы получить более "красивый" вид запросов и ухудшить из-за этого быстродействие UniDAC для всех наших пользователей.

Закрыто