Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2014, 14:58
Dagmanor Dagmanor вне форума
Прохожий
 
Регистрация: 14.06.2012
Сообщения: 26
Версия Delphi: Delphi 2010 / 7
Репутация: 10
По умолчанию Вложенный запрос Firebird

Всем доброго времени суток. Прошу помощи в написании вложенного запроса для Firebird 2.5. Работаю в Delphi 7 с помощью компонентов FIBPlus.

Запрос такой :


Код:
SELECT * ,
 (SELECT test.guid from test where test.id IN (SELECT course_test.test_id FROM course_test WHERE course_test.course_id = 2)) AS test_guid 
FROM seminar WHERE seminar.id IN (SELECT course_seminar.seminar_id FROM course_seminar WHERE course_seminar.Course_id = 2)


Получаю вот такую ошибку:

SQL error code = -104.
Token unknown - line 1, column 121.
).
'. Process stopped. Use Step or Run to continue.


С Firebird работаю только недавно. Не могу понять в чем ошибка. Первой мыслью было, что я где-то лишнюю закрываюю скобку поставил (или не поставил открывающую). Но вроде с скобками все хорошо... Где же я затупил?
Ответить с цитированием
  #2  
Старый 26.02.2014, 15:31
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

сдается мне ему в
Цитата:
Код:
SELECT * ,
"звездочка" не нравится, попробуй прописать названия нужных полей вручную
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 26.02.2014 в 15:37.
Ответить с цитированием
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
Dagmanor (26.02.2014)
  #3  
Старый 26.02.2014, 15:40
Dagmanor Dagmanor вне форума
Прохожий
 
Регистрация: 14.06.2012
Сообщения: 26
Версия Delphi: Delphi 2010 / 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Yurk@
сдается мне ему в "звездочка" не нравится, попробуй прописать названия нужных полей вручную

Пробовал... Не помогает.
Ответить с цитированием
  #4  
Старый 27.02.2014, 09:00
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Если
Код:
SELECT seminar.* ,
 (SELECT test.guid from test where test.id IN (SELECT course_test.test_id FROM course_test WHERE course_test.course_id = 2)) test_guid 
FROM seminar WHERE seminar.id IN (SELECT course_seminar.seminar_id FROM course_seminar WHERE course_seminar.Course_id = 2)
не помогает, стоит проверить соответствие типов используемых полей
__________________
Google в помощь
Ответить с цитированием
  #5  
Старый 27.02.2014, 09:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,016
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Запрос в принципе проблемный.
Как ты думаешь, сколько записей вернет тебе вложенный запрос в SELECT? Ты уверен, что он всегда вернет одну запись? Подумай как его переписать через JOIN'ы (не имея БД и не зная что ты хочешь очень сложно подсказать что-то более конкретное).
Ответить с цитированием
  #6  
Старый 27.02.2014, 10:31
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Действительно, проверь еще всегда ли test_guid возвращает одну запись
__________________
Google в помощь
Ответить с цитированием
  #7  
Старый 27.02.2014, 13:01
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
Ты уверен, что он всегда вернет одну запись?
та причем тут это, он на синтаксис ругается

Цитата:
Сообщение от lmikle
Подумай как его переписать через JOIN'ы
тут согласен

ТС, у меня запрос вида:
Код:
SELECT s.*,
 (
 SELECT t.guid
 FROM test t
 WHERE t.id IN
   (
   SELECT ct.test_id
   FROM course_test ct
   WHERE ct.course_id = 2
   )
 ) AS test_guid
FROM seminar s
WHERE s.id IN
  (
  SELECT cs.seminar_id
  FROM course_seminar cs
  WHERE cs.course_id = 2
  )
нормально отработался (я не говорю что правильно, но отработался)

PS. попробуй такой запрос (не уверен что все 100% точно со связями, но принцип такой)
Код:
SELECT s.*, t.guid test_guid
FROM seminar s
  JOIN course_test ct ON ct.course_id = 2
  LEFT JOIN test t ON ct.test_id = t.id
  JOIN course_seminar cs ON s.id = cs.seminar_id
WHERE cs.course_id = 2 
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 27.02.2014 в 13:26.
Ответить с цитированием
  #8  
Старый 15.03.2014, 17:14
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Звездочку вместе с запятой можно использовать только с точечным именем таблицы, то есть:
Код:
select s.*, some_other from my_table s, other_table; --  можно

select *, some_other from my_table, other_table; --  нельзя
А вообще сам запрос быдлячий, по-хорошему его надо переписать с join-ом или просто через равенство в where.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter