запрос с объединением нескольких баз данных - синтаксическая ошибка - PullRequest
1 голос
/ 02 ноября 2010

У меня есть 2 базы данных, а именно db1, db2.Мне нужен запрос, который извлекает данные из этих баз данных (db1, db2), каждая из которых имеет по две таблицы (концессии, выставление счетов).

В db1.concessions => концессия является первичным ключом.db1.invoicing => [Номер концессии] является первичным ключом

аналогично в db2.concessions => концессия является первичным ключом.db2.invoicing => [Номер концессии] является первичным ключом

В базе данных1

db1.tbl1 => Таблица концессий содержит данные

    concession
    TH-123
    TH-456
    FP-789
    NZ-609

db1.tbl2 => таблица выставления счетов содержит данные

    [Concession Number]          invoiced_on
    TH-322                        10.09.10
    TH-900                        23.10.10
    FP-675                        04.05.09
    NZ-111                        19.11.08

, к счастью, в базе данных значение концессии в уникальном.т.е. концессии. [концессия] = выставление счета. [номер концессии] не дает данных ..

В базе данных2:

db1.tbl1 => Таблица концессий содержит данные

    concession
    TH-123
    FP-789
    NZ-999
    TH-900

db1.tbl2 => таблица выставления счетов содержит данные

    [Concession Number]          invoiced_on(dd.mm.yy)
    TH-456                        18.01.06
    TH-777                        23.10.04
    FP-675                        03.05.09
    NZ-149                        26.11.08

Здесь в концессии db2 есть уникальные концессии. [Концессия] = выставление счета. [Номер концессии] не дает данных ..

Теперь запрос должен извлекать записи, которые имеют общий db1. (Concessions.concession ИЛИ invoicing.concession number) = db2 (concessions.concession ИЛИ invoicing.concession number)

В данных примерадолжен вернуться, TH-123, FP-789, NZ-999, FP-675.

Мой 2-й вопрос заключается в возможности расширения этого запроса для нескольких баз данных.Я не могу изменить количество баз данных на 1, поскольку они уже фиксированы .Пожалуйста, дайте мне знать лучшую процедуру для того же.

Я пробовал что-то вроде этого, есть синтаксические ошибки,

SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a  UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER  FROM db1.dbo.invoicing as b 
INNER JOIN 
SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as c  UNION 
SELECT d.[Concession Number] as db2_CON_NUMBER  FROM db2.dbo.invoicing as d 
ON db1_CON_NUMBER = db2_CON_NUMBER 

Надеюсь, вы ответите на оба вопроса.Спасибо за ваше терпение в чтении такой длинной почты!

Ответы [ 3 ]

4 голосов
/ 02 ноября 2010

Вы можете ссылаться на другие базы данных напрямую, если у пользователя есть разрешения.

<database>.<user>.<tablename>

Полный «путь» к таблице базы данных.

Часто вы используете

db1.dbo.tbl1 join db2.dbo.tbl2

где dbo по умолчанию для владельца базы данных, любая таблица, не принадлежащая конкретному пользователю, по умолчанию принадлежит dbo.

UPDATE

Чтобы запрос был подтвержден, вы можете расширить его до

SELECT * FROM 
(SELECT a.concession as db1_CON_NUMBER FROM db1.dbo.concessions as a  
UNION 
SELECT b.[Concession Number] as db1_CON_NUMBER FROM db1.dbo.invoicing as b ) c

INNER JOIN 

(SELECT c.concession as db2_CON_NUMBER FROM db2.dbo.concessions as a 
UNION 
SELECT b.[Concession Number] as db2_CON_NUMBER FROM db2.dbo.invoicing as b ) d

ON db1_CON_NUMBER = db2_CON_NUMBER 

Но у меня не было времени проверить, вернут ли это верные данные, но вы можете проверить.

2 голосов
/ 02 ноября 2010

Если базы данных находятся в одном и том же экземпляре SQL Server, вы можете использовать именование из 3 частей:

database_name.schema_name.object_name

Использование идентификаторов в качестве имен объектов

Если базы данных не находятся в одном экземпляре, создайте связанный сервер: Связанные серверы

Создание связанных серверов (ядро базы данных SQL Server)

Связанный сервер обеспечивает доступ к распределенные гетерогенные запросы против источников данных OLE DB. После связанный сервер создан, распределен запросы могут быть запущены против этого сервер и запросы могут объединять таблицы из более чем одного источника данных. Если связанный сервер определяется как экземпляр SQL Server, удаленный хранится процедуры могут быть выполнены.

0 голосов
/ 02 ноября 2010
select * from(
SELECT a.concession as db1_CON_NUMBER FROM BABMwork6_5_3108.dbo.concessions as a  
        WHERE (a.manuell_archive_delete! = 'Delete' OR  a.manuell_archive_delete IS NULL) 
UNION SELECT b.[Concession Number] as db1_CON_NUMBER  FROM BABMwork6_5_3108.dbo.invoicing as b) as tbl1 
INNER JOIN 
(SELECT c.concession as db2_CON_NUMBER FROM BABMwork6_6_2909.dbo.concessions as c  
        WHERE (c.manuell_archive_delete! = 'Delete' OR  c.manuell_archive_delete IS NULL) 
UNION SELECT d.[Concession Number] as db2_CON_NUMBER  FROM BABMwork6_6_2909.dbo.invoicing as d ) as tbl2
ON tbl1.[db1_CON_NUMBER] = tbl2.[db2_CON_NUMBER]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...