Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вложенный запрос к Oracle в запросе к MS SQL, JOIN 
V
    Опции темы
Агрох
Дата 4.8.2014, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Есть две базы, одна на MS SQL, вторая на Oracle.
В MS SQL настроен связанный сервер - Oracle.
Нужно выполнить запрос вида:
Код

SELECT EVENTS.SAMPLECODE
    , EVENTS.Param1
    , EVENTS.Param2   
FROM Oracle..DBName.EVENTS AS EVENTS 
  INNER JOIN (SELECT MP.PROBE_BARCODE                    AS SAMPLECODE
            FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP 
            WHERE CAST(MP.TDATE AS Date) = '11.01.2014') AS TT 
    ON EVENTS.SAMPLECODE = TT.SAMPLECODE


Подскажите, как организовать сиё чудо.
В таком виде оно условно говоря работает, только я ни разу не дождался результата. Слишком долго. Видимо пытается выгрузить сначала всю таблицу из Oracle, а потом уже выполняет запрос.

Знаю про такую хорошую штуку, как:
Код

select * from openquery (Oracle,'select * from DBName.EVENTS');

Но пока не могу сообразить, можно ли это как то приспособить к решению задачи. Разве что через:
Код

declare @str nvarchar(max); 
set @str = '';

select @str = @str + ', ' + MP.PROBE_BARCODE
            FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP 
            WHERE CAST(MP.TDATE AS Date) = '11.01.2014'

if @@rowcount > 0 set @str = substring(@str, 3, len(@str) - 2)
print @str


Это сообщение отредактировал(а) Агрох - 4.8.2014, 17:06
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 4.8.2014, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Агрох @  4.8.2014,  18:03 Найти цитируемый пост)
Видимо пытается выгрузить сначала всю таблицу из Oracle, а потом уже выполняет запрос.

А как ты себе представляешь выполнение этого запроса иначе?

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

Что взять - вообще зависит от того, сколько в том и в другом случае передавать связанному серверу. В первом случае это вся таблица EVENTS. Во втором - это набор данных подзапроса плюс итоговый набор данных. В каком варианте меньше, тот и выбирай. 

Но ежели судить по названиям таблиц - на Oracle таблица офигенная, да ещё частоизменяемая, а на MS SQL более-менее статическая, да и записей не так много. Посему второй вариант скорее всего более разумен. Правда, при этом придётся не только Oracle делать связанным на MS SQL, но и наоборот.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Агрох
Дата 5.8.2014, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Цитата(Akina @  4.8.2014,  18:28 Найти цитируемый пост)
А как ты себе представляешь выполнение этого запроса иначе?


Никак. Подобные задачи ранее не выполнял.

Цитата(Akina @  4.8.2014,  18:28 Найти цитируемый пост)
Первый - выгрести к себе Oracle таблицу и затем отобрать нужное, собсно этот вариант у тебя уже реализован. 


Слишком долго выполняется.

Цитата(Akina @  4.8.2014,  18:28 Найти цитируемый пост)
Второй - это получить набор записей подзапроса на MS SQL, передать его Oracle для выполнения основного запроса и возврата данных.


Воот. Пробовал записывать данные из MS SQL запроса во временную таблицу на сервере Oracle, но ни это:

Код

INSERT INTO openquery('SELECT SAMPLECODE FROM DBName.TEMP_TABLE') SELECT MP.PROBE_BARCODE AS SAMPLECODE FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP WHERE CAST(MP.TDATE AS Date) = '11.01.2014'


ни более прямое:

Код

INSERT INTO Oracle..DBName.TEMP_TABLE SELECT MP.PROBE_BARCODE AS SAMPLECODE FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP WHERE CAST(MP.TDATE AS Date) = '11.01.2014'


эффекта не возымели. Видимо надо либо как то по другому настраивать связь между серверами, либо где то разрешения не прописаны, либо что то ещё. Можете подсказать, куда копать дальше?

Добавлено через 56 секунд
Цитата(Akina @  4.8.2014,  18:28 Найти цитируемый пост)
при этом придётся не только Oracle делать связанным на MS SQL, но и наоборот


А зачем?
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 5.8.2014, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(Агрох @  5.8.2014,  10:21 Найти цитируемый пост)
А зачем? 

Да вот как раз затем, чобы не гнать данные в Оракл в статическую таблицу. Чтобы делать что-то вроде

Код

select * 
from openquery (Oracle,
  ' select * 
    from DBName.EVENTS
    inner join 
    (
      select *
      from oracle_openquery (MSSQL,
      ' SELECT MP.PROBE_BARCODE AS SAMPLECODE 
        FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP  
        WHERE CAST(MP.TDATE AS Date) = "11.01.2014"
      ') ... ON ...
    )
  '
);


Добавлено через 3 минуты и 12 секунд
Итог. 
MS SQL обращается к Ораклу через openquery, передавая ему текст запроса. Оракл его начинает выполнять. Для его выполнения он должен обратиться обратно к MS SQL своим openquery, передавая текст требуемого подзапроса. MS SQL принимает текст подзапроса, выполняет, отправляет результат Ораклу. Тот выполняет запрос, отправляет результат на MS SQL. Всё. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Агрох
Дата 5.8.2014, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Akina, спасибо. Попробую этот вариант.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Агрох
Дата 5.8.2014, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Цитата(Агрох @  5.8.2014,  10:21 Найти цитируемый пост)
Цитата(Akina @  4.8.2014,  18:28 )
А как ты себе представляешь выполнение этого запроса иначе?

Никак. Подобные задачи ранее не выполнял.


Кстати ошибся. Всё таки делал. Если оба сервера MS SQL то аналогичный запрос выполняется, по времени, так, как если бы это был один сервер.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 5.8.2014, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Агрох
Дата 5.8.2014, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Пока нет доступа к настройкам сервера с Oracle, хочу спросить: почему я не могу из под mssql добавлять данные во временную таблицу oracle?
Код

INSERT INTO openquery('SELECT SAMPLECODE FROM DBName.TEMP_TABLE') SELECT MP.PROBE_BARCODE AS SAMPLECODE FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP WHERE CAST(MP.TDATE AS Date) = '11.01.2014'

или
Код

INSERT INTO Oracle..DBName.TEMP_TABLE SELECT MP.PROBE_BARCODE AS SAMPLECODE FROM MSSQLDBNAME.dbo.MARKS_PROBECUR AS MP WHERE CAST(MP.TDATE AS Date) = '11.01.2014'


Это сообщение отредактировал(а) Агрох - 5.8.2014, 13:53
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 5.8.2014, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20580
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Не понял... это MS SQL отказывается записывать данные, или всё-таки Оракл? разберись... ну хотя бы по сообщениям об ошибках.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Агрох
Дата 5.8.2014, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Сообщений об ошибках нет. MS SQL пишет "Обработано NNNN строк", т.е. свою часть MS SQL выполняет исправно. Но таблица в Oracle остаётся пустой.

Добавлено через 55 секунд
Может лучше в разделе ораклистов спросить?
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Агрох
Дата 5.8.2014, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: нет
Всего: 6



Понял свой косяк. Таблица ж временная. smile 
Код

CREATE GLOBAL TEMPORARY TABLE OMNILAB.TEMP_TABLE(SAMPLECODE VARCHAR2(14));

Сама таблица остаётся, когда завершается транзакция, а вот все данные из неё подтираются. Думаю сделать реальную "временную"таблицу, которую буду дропать после использования.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0897 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.