Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с LIKE [FB1.5]


Германн ©   (2008-01-25 17:50:00) 

Запрос SELECT CARDIDX.ID_CARD, PEOPLE.SURNAME, PEOPLE.Name, PEOPLE.Patronymic,
     ORGANIZATION.Name from CARDIDX, CARD, PEOPLE, ORGANIZATION
      where (CARDIDX.ID_Card = CARD.ID_Card) and (CARD.ID_Pep = PEOPLE.ID_Pep)
      and (PEOPLE.ID_Org = ORGANIZATION.ID_Org) and (CARDIDX.Id_Dev = 2)
      and (CARDIDX.Load_Result like 'ERR%') в редакторе SQL IBExpert'а работает нормально. Отбирает нужные записи. Тот же запрос в программе не находит ни одной записи like 'ERR%'. Ошибок никаких не выдается. Возможно это связано с тем, что в программе TADODataset подключен к базе через ODBC драйвер? Как быть?


Германн   (2008-01-25 23:58:00) [1]


> turbouser ©   (25.01.08 22:01) [17]
>
>

Спасибо за ссылку. Сохранил статью на будущее. Прочитав понял  
> почему именно это сочетание дало нужный мне результат

Век живи, век учись. :)


turbouser   (2008-01-25 22:01:00) [2]


> Германн ©   (25.01.08 21:51) [16]
>
>
> > Ничего сложного, как раз все просто, да ты и так используешь
> > неявный INNER JOIN
> >
>
> Сложного конечно ничего, только надо знать что и как работает.
>

См. ссылку в [12] - там как раз про джойны. Явные и неявные.


Германн   (2008-01-25 21:51:00) [3]


> Ничего сложного, как раз все просто, да ты и так используешь
> неявный INNER JOIN
>

Сложного конечно ничего, только надо знать что и как работает. Потому что вот такой запрос три года назад я получил методом ненаучного тыка:
select Rooms.ID_Group, Rooms.NameRoom, Rooms.ID_Rooms,
 Groups.GName, ConfRR.Addr, ConfRR.Reader
from (Rooms left join ConfRR
on (Rooms.ID_Rooms = ConfRR.ID_Rooms))
left join Groups
on (Rooms.ID_Group = Groups.ID_Group)
Group by Rooms.ID_Group, Groups.GName, Rooms.ID_Rooms,
 Rooms.NameRoom, ConfRR.Addr, ConfRR.Reader

Перепробовал при этом всякие сочетания неизвестных мне по сути терминов join, left, outer и т.п. Спроси меня что означает left join и почему именно это сочетание дало нужный мне результат и я отвечу Х.З.


Anatoly Podgoretsky   (2008-01-25 20:55:00) [4]


> Ну join для меня почти высший класс. Про них мне еще читать
> и читать. Но попробую. А вот в чем преимущество алиасов?

Ничего сложного, как раз все просто, да ты и так используешь неявный INNER JOIN

А алиасы дают два преимущества

1. однозначность
2. компактность


Petr V. Abramov   (2008-01-25 19:39:00) [5]

[13] - это про явные джойны, алиасы, ессно, вещь хорошая.


Petr V. Abramov   (2008-01-25 19:38:00) [6]


> Запрос все-таки неплохо бы переделать. С алиасами и явными
> join-ами.

нафига? читать не проще, писать не быстрее, результат тот же.


turbouser   (2008-01-25 19:23:00) [7]


> Германн ©   (25.01.08 19:15) [10]

http://www.ibase.ru/devinfo/joins.htm
Процитирую :
алиасы таблиц. Без использования алиасов таблиц все версии InterBase (кроме Firebird начиная с 1.0) могут выдать непредсказуемый результат, то есть, перепутать местами столбцы NAME из таблицы товаров и таблицы клиентов. Алиасы позволяют не только избежать этого, но и повышают "переносимость" запроса, а также облегчают понимание, из какой таблицы выбирается какой столбец (даже если в выборке нет одинаковых имен столбцов). В Firebird 2.0 не допускается смешивание алиасов и имен таблиц, не рекомендуется это делать и для других версий InterBase и Firebird.


Германн   (2008-01-25 19:22:00) [8]


> Johnmen ©   (25.01.08 19:12) [9]
>
> ...причем сначала должны соединяться таблицы, в которых
> меньшее число записей.
>

Учту.


Германн   (2008-01-25 19:15:00) [9]


> turbouser ©   (25.01.08 19:06) [8]
>
>
> > Германн ©   (25.01.08 19:03) [7]
>
> Запрос все-таки неплохо бы переделать. С алиасами и явными
> join-ами.
>

Ну join для меня почти высший класс. Про них мне еще читать и читать. Но попробую. А вот в чем преимущество алиасов?


Johnmen   (2008-01-25 19:12:00) [10]

...причем сначала должны соединяться таблицы, в которых меньшее число записей.


turbouser   (2008-01-25 19:06:00) [11]


> Германн ©   (25.01.08 19:03) [7]

Запрос все-таки неплохо бы переделать. С алиасами и явными join-ами.
Например так:
SELECT
 CX.ID_CARD,
 P.SURNAME,
 P.Name,
 P.Patronymic,
 O.Name
from CARD C
 join CARDIDX CX on CX.ID_Card = C.ID_Card
 join PEOPLE P on P.ID_Pep=C.ID_Pep
 join ORGANIZATION O on O.ID_Org=P.ID_Org
where
 CX.Id_Dev = 2 and
 CX.Load_Result like 'ERR%'


Германн   (2008-01-25 19:03:00) [12]

А ларчик просто открывался. В IBExpert'е была открыта база с другого компьютера, в которой строчки like 'ERR% были. А в моей базе их таки и не было.
:-)


Германн   (2008-01-25 18:47:00) [13]


> Смысл: поставить пару кавычек слева и пару справа (не двойные
> кавычки, а именно пару одинарных)

Там так и есть. В смысле в CommandText.


ПостОвый терминатор   (2008-01-25 18:38:00) [14]

Получилось не очень наглядно. Смысл: поставить пару кавычек слева и пару справа (не двойные кавычки, а именно пару одинарных)


ПостОвый терминатор   (2008-01-25 18:36:00) [15]

Похоже, что здесь необходимо пошаманить с кавычками

> (CARDIDX.Load_Result like 'ERR%')

что-то типа

> (CARDIDX.Load_Result like ''ERR%' ')

Попробуй, у меня, правда, не IB и не ODBC


Германн   (2008-01-25 18:21:00) [16]


> Германн ©   (25.01.08 18:15) [2]

Не вру. Token unknown - это от другого ошибка. Но с * результат абсолютно такой же как и с %. Возвращает пустой набор.


Германн   (2008-01-25 18:15:00) [17]


> Palladin ©   (25.01.08 18:04) [1]
>
> попробуй не % использовать а *
>

Пробовал. Получил:
 2.5 Type          : EOleException
 2.6 Message       : [Gemini InterBase ODBC Driver][INTERBASE]Dynamic SQL Error. SQL error code = -104. Token unknown - line 1, char 306. ).


Palladin   (2008-01-25 18:04:00) [18]

попробуй не % использовать а *


Наверх

Титульная страница Поиск, карта сайта Написать письмо