Внутреннее соединение из других баз данных - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно внутреннее соединение данных из разных баз данных.Три, если быть точным.

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

Должен ли я присоединиться к одному за раз вместо того, чтобы делать все 3 сразу?Сложной задачей было присвоить таблицу результатов из первого запроса переменной, чтобы я мог внутренне объединить ее с последующими таблицами.

Текущий код, который у меня есть

(DECLARE @SDate date = '01/01/2018'
DECLARE @EDate date = '12/31/2018'

DECLARE @Sku TABLE
(
  Sku varchar(20)
);

INSERT @Sku (Sku)
VALUES 
(N'SN2150'),
(N'SN2151'); 

SELECT        
   l.No_ 
  ,SUM(l.Amount) AS Amount
  ,SUM(l.Quantity) AS Quantity
FROM 
  dbo.[Threshold Enterprises$Sales Invoice Line] AS l
  JOIN
   @Sku AS s
    ON s.Sku = l.No_
WHERE
  l.[Shipment Date] BETWEEN @SDate AND @EDate
GROUP BY
  l.No_) 

  AS a


Select [Item.No_] and [Suggested Retail Price] and [Starting Date] FROM [NAV- 
   WH].dbo.v_NAV_PurchasePriceCurrent b

Select [No_] and [Size] and [Size.Type] FROM [NAV-WH].[dbo].[Threshold 
Enterprises$Item] c


Inner Join a b c where a.[@SKU]=b.[Item.No_]=c.[No_]

Получить следующееСообщение об ошибке

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'DECLARE'.
Msg 102, Level 15, State 1, Line 26
Incorrect syntax near ')'.

Ожидайте результатов, чтобы получить SKU, продажи, проданные единицы, розничную цену, начальные данные, размер и тип размера.

Пробовал предыдущий код, но он далто же сообщение об ошибке

Msg 207, Level 16, State 1, Line 25
Invalid column name 'Item.No_'.

Код, который я пытался использовать вместо того, чтобы все изложить, было:

DECLARE @SDate date = '01/01/2018'
DECLARE @EDate date = '12/31/2018'

DECLARE @Sku TABLE
(
  Sku varchar(20)
);

INSERT @Sku (Sku)
VALUES 
(N'SN2150'),
(N'SN2151'); 

SELECT        
   l.No_ as SKU
  ,SUM(l.Amount) AS Amount
  ,SUM(l.Quantity) AS Quantity
  ,[NAV-WH].[dbo].[v_NAV_PurchasePriceCurrent].[Suggested Retail Price]
  ,[NAV-WH].[dbo].[v_NAV_PurchasePriceCurrent].[Starting Date]
  ,[NAV-WH].[dbo].[ThresholdEnterprises$Item].Size
  ,[NAV-WH].[dbo].[ThresholdEnterprises$Item].[Size.Type]
FROM 
  dbo.[Threshold Enterprises$Sales Invoice Line] AS l
  JOIN @Sku AS s ON s.Sku = l.No_
  JOIN [NAV-WH].[dbo].[v_NAV_PurchasePriceCurrent] on [NAV-WH].[dbo]. 
   [v_NAV_PurchasePriceCurrent].[Item.No_] = l.No_
  JOIN [NAV-WH].[dbo].[ThresholdEnterprises$Item] on [NAV-WH].[dbo]. 
   [ThresholdEnterprises$Item].[No_] = l.No_
WHERE
  l.[Shipment Date] BETWEEN @SDate AND @EDate
GROUP BY
  l.No_

Ответы [ 2 ]

1 голос
/ 26 июня 2019

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

FROM [DB1].[dbo].[TableA] a
JOIN [DB2].[dbo].[TableB] b on a.Key = b.Key
LEFT JOIN [DB3].[dbo].[TableC] on c.Key = a.Key

Если базы данных находятся в разных экземплярах, установите между ними связанный сервер, а затем используйте имена из 4 частей ...JOIN [LINKEDSERVER].[DB2].[dbo].[TableB]...

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

Редактировать - исходя из ваших правок на исходный вопрос, я бы рекомендовал сделать все сразу. Попробуйте это (я не смог проверить это, потому что у меня нет всех ваших таблиц).

DECLARE @SDate date = '01/01/2018'
DECLARE @EDate date = '12/31/2018'

DECLARE @Sku TABLE
(
  Sku varchar(20)
);

INSERT @Sku (Sku)
VALUES 
(N'SN2150'),
(N'SN2151'); 

SELECT        
   l.No_ as SKU
  ,SUM(l.Amount) AS Amount
  ,SUM(l.Quantity) AS Quantity
  ,b.[Suggested Retail Price]
  ,b.[Starting Date]
  ,c.Size
  ,c.[Size.Type]
FROM 
  dbo.[Threshold Enterprises$Sales Invoice Line] AS l
  JOIN @Sku AS s ON s.Sku = l.No_
  JOIN [NAV-WH].[dbo].[v_NAV_PurchasePriceCurrent] b on b.[Item.No_] = l.No_
  JOIN [NAV-WH].[dbo].[ThresholdEnterprises$Item] c on c.[No_] = l.No_
WHERE
  l.[Shipment Date] BETWEEN @SDate AND @EDate
GROUP BY
  l.No_
0 голосов
/ 02 июля 2019

Я смог заставить его работать.Это была простая группа.Спасибо тем, кто указал мне правильное направление!

use [NAV-WH]

DECLARE @SDate date = '01/01/2018'
DECLARE @EDate date = '12/31/2018'

DECLARE @Sku TABLE
(
  Sku varchar(20)
);

INSERT @Sku (Sku)
VALUES 
(N'SN2150'),
(N'SN2151'); 


SELECT [Threshold Enterprises$Item].No_ AS SKU, SUM([Threshold 
Enterprises$Sales Invoice Line].Amount) AS Amount, SUM([Threshold 
Enterprises$Sales Invoice Line].Quantity) AS Quantity, 
                         v_NAV_PurchasePriceCurrent.[Suggested Retail Price], 
v_NAV_PurchasePriceCurrent.[Starting Date], [Threshold Enterprises$Item].Size, 
[Threshold Enterprises$Item].[Size Type]
FROM [Threshold Enterprises$Item] INNER JOIN
                         v_NAV_PurchasePriceCurrent ON [Threshold 
Enterprises$Item].No_ = v_NAV_PurchasePriceCurrent.[Item No_] INNER JOIN
                         [Threshold Enterprises$Sales Invoice Line] ON 
[Threshold Enterprises$Item].No_ = [Threshold Enterprises$Sales Invoice 
Line].No_
WHERE ([Threshold Enterprises$Item].No_ = N'SN2051' OR
                         [Threshold Enterprises$Item].No_ = N'SN2151') AND 
([Threshold Enterprises$Sales Invoice Line].[Shipment Date] BETWEEN @SDate AND 
@EDate)
GROUP BY [Threshold Enterprises$Item].No_, v_NAV_PurchasePriceCurrent. 
   [Suggested Retail Price], v_NAV_PurchasePriceCurrent.[Starting Date], [Threshold 
Enterprises$Item].Size, [Threshold Enterprises$Item].[Size Type]
...