Страница 1 из 1

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

Добавлено: Пн 25 июн 2012 08:49
Akella
Вот запрос

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

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

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

Добавлено: Пн 25 июн 2012 13:24
bork
Добрый день

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

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

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