Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2016, 09:19   #1
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию PostgresSQL. dblink к базе, но что-то запрос сломанный.

Доброго времени суток.
Пытаюсь получить всего лишь 1 значение в архивной БД, пишу:
Код:
SELECT "t1"."IDregion" 
    FROM dblink('archive', 'SELECT naimzak, IDregion FROM zakazchik')
      AS t1(naimzak VARCHAR, IDregion integer)
    WHERE "naimzak" = "rZakazchik"."naimzak" LIMIT 1 INTO IDregionAr;
На что мне ругается см. вложение.
Что я не так делаю с "t1"."IDregion"?
Ну, как это понимаю я:
Формируется таблица t1 из всех заказчиков с регионами из архивной.
Далее я вытягиваю айдишку региона этой таблицы t1 по наименованию заказчика, на всякий случай LIMIT 1, хотя больше 1 не может быть, но на всякий случай.
Пишу вытянутую айдишку в IDregionAr.
Изображения
Тип файла: png Безымянный.png (10.5 Кб, 71 просмотров)
Artsiom вне форума Ответить с цитированием
Старый 21.12.2016, 12:11   #2
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

)никто не знает почему он ругается на "t1"."IDregion"?
Всё же правильно пишу.
Artsiom вне форума Ответить с цитированием
Старый 21.12.2016, 12:22   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не знаю почему ругается. А что такое rZakazchik? И where лучше во вложенный запрос засунуть, не?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 12:39   #4
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А что такое rZakazchik?
Это поля с заказчиком из основной БД.
Получаю выше:
Код:
 SELECT * FROM zakazchik WHERE "ID" = "inID" LIMIT 1 INTO "rZakazchik";
Цитата:
Сообщение от Аватар Посмотреть сообщение
И where лучше во вложенный запрос засунуть, не?
В смысле? Как?
И зачем?
Ну, сейчас запрос выглядит, грубо говоря, так:
Код:
SELECT "t1"."IDregion" FROM t1
WHERE "naimzak" = "rZakazchik"."naimzak"
LIMIT 1 INTO IDregionAr;
Выбрать из таблицы t1 IDregion по условию "t1"."naimzak" = "rZakazchik"."naimzak"
и записать его в IDregionAr
Artsiom вне форума Ответить с цитированием
Старый 21.12.2016, 13:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
И зачем?
Видимо потому, что сначала выполнится это:
SELECT naimzak, IDregion FROM zakazchik
все полученные данные запишутся в какую-то временную таблицу. И потом внешний запрос из неё выберет одну строку. Полагаю лучше во внутреннем запросе выбрать одну строку, эффективней. Как получится проверь по времени оба варианта

Что касается rZakazchik. Обычно с точкой алиас или имя таблицы и поле. Где это имя в FROM этого запроса, а не предыдущего? Ладно, проехали, может Postgress такой хитрый, его то я не знаю ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.12.2016 в 13:09.
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 13:48   #6
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Хм, да, возможно это была моя ошибка, но этого мы никогда не узнаем, потому как переписал запрос.
Дело ещё было и в двойных кавычках.
Да, всё же если вытягивать не всё таблицу, то быстрее, но я хз как засечь это время, но если включить воображение и логику - то да, быстрее.
Переписанный запрос:
Код:
"rZakazchik"."naimzak" = replace("rZakazchik"."naimzak", '"', '""');

sql_query = 'SELECT "zakazchik"."IDregion" FROM "zakazchik" WHERE "zakazchik"."naimzak" = "'||"rZakazchik"."naimzak"||'" LIMIT 1;';

SELECT * FROM dblink('archive', sql_query) AS t1(IDregion integer) INTO IDregionAr;
1. Экранирую двойные кавычки.
2. Составляю запрос.
3. Получаю результат.
И опять ругается...
Что-то WHERE "zakazchik"."naimzak" = "Государственное предприятие "йцуке"" не нравится.
Изображения
Тип файла: png Безымянный.png (13.4 Кб, 76 просмотров)
Artsiom вне форума Ответить с цитированием
Старый 21.12.2016, 14:36   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А константы в каких кавычках должны быть? Судя по ошибке не в двойных. Типа такого
Код:
sql_query = 'SELECT "zakazchik"."IDregion" FROM "zakazchik" WHERE "zakazchik"."naimzak" = '''||"rZakazchik"."naimzak"||''' LIMIT 1;';
В константе тогда и одинарные нужно экранировать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.12.2016 в 14:39.
Аватар вне форума Ответить с цитированием
Старый 21.12.2016, 15:42   #8
Artsiom
Форумчанин
 
Аватар для Artsiom
 
Регистрация: 13.07.2012
Сообщений: 357
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А константы в каких кавычках должны быть? Судя по ошибке не в двойных. Типа такого
Код:
sql_query = 'SELECT "zakazchik"."IDregion" FROM "zakazchik" WHERE "zakazchik"."naimzak" = '''||"rZakazchik"."naimzak"||''' LIMIT 1;';
В константе тогда и одинарные нужно экранировать
Да! Точно! Спасибо!!!!!
'''||"rZakazchik"."naimzak"||''' должен быть именно в одинарных экранированных.
После чего экранирование двойных можно убирать, ибо не нужно.
Чччерт, а как вы по ошибке определили, что это в одинарных то дело? Я до сих пор не понял...
Artsiom вне форума Ответить с цитированием
Старый 21.12.2016, 15:43   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Потому что считает колонкой и не находит ее. Как в мускуле - для полей одни кавычки, для констант другие. В MS SQL тоже, ток там для полей квадратные скобки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 21.12.2016 в 15:49.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
надо привязать php сайт к базе данных Access и что бы при заполнение формы на сайте данные сохранялись в базе Алёна_))) Microsoft Office Access 2 20.06.2012 12:24
запрос(postgressql) kolyan4 Помощь студентам 2 23.01.2011 21:56
как сформировать запрос к базе, что бы узнать есть ли уже такой товар? FACE OFF Помощь студентам 2 10.12.2010 09:35
dblink в Access soulbringer Microsoft Office Access 2 18.10.2010 13:33
Под что может использоваться сломанный DVD плеер? Krasi Компьютерное железо 0 25.09.2010 12:11