从2个更新表中选择具有数千行SQL的不同数据库

时间:2019-01-24 10:23:53

标签: sql-server

我有2个Openquery,它们只是从2个表中进行简单选择。我的目标是使用这两个查询返回的数据填充单个表,这些查询基本上返回相同的内容但名称不同。

示例

第一仓库1

Select * From OpenQuery ('SELECT * FROM Warehouse1')

第二仓库2

Select * From OpenQuery ('SELECT * FROM Warehouse2')

我需要成千上万的行来更新我的SQL表。问题是,如果我使用UNION,这将非常昂贵,而我的问题是如何才能达到最佳性能呢?这也是来自外部数据库的数据,所以我真的无法更改查询

仅当用户访问显示数据的列表时,我才需要使用这些查询更新主表

编辑。

我不是很清楚,但是两个表都返回相同类型的列

| ID  |  Warehouse | Ticket | Item | Qty

一个属于仓库1,另一个属于仓库2,两者的行数不同。

3 个答案:

答案 0 :(得分:0)

您可以将内部联接与更新一起使用,为此您需要使表别名如下所示

UPDATE A    
  SET A.<ColName> = B.<ColName>
from Warehouse1 A
  INNER JOIN Warehouse2 B
    ON A.<Id> = B.<Id>
--where if required

答案 1 :(得分:0)

但是为什么需要UNION? 您只需在交易中插入2次即可。

BEGIN TRY
BEGIN TRAN T1
   INSERT into mytable 
       --select from openquery table 1
   INSERT into mytable
       --select from openquery table 2
COMMIT TRAN T1
END TRY
BEGIN CATCH
   ---handle error
   ROLLBACK TRAN T1
END CATCH

答案 2 :(得分:0)

对于任何与我有相同问题的人。这是我想出的更适合我的问题的解决方案。

我将打开的查询保存在视图中,因为不需要更改任何内容或根本不需要在数据库中插入

/*************************** Views ********************************/
GO
IF OBJECT_ID('viewx_POE', 'v') IS NOT NULL
DROP VIEW viewx_POE
GO
CREATE VIEW viewx_POE AS 
SELECT ET0104 AS Armazem, 
       ET0109 AS Localizacao, 
       ET0102 AS Etiqueta,
       ET0101 AS Artigo,
       ET0103 AS Quantidade    
FROM OpenQuery(MACPAC, 'SELECT FET001.ET0104, FET001.ET0109, FET001.ET0102, FET001.ET0101, FET001.ET0103
FROM AUTO.D805DATPOR.FET001 FET001
WHERE (FET001.ET0104=''POE'') AND (FET001.ET0105=''DIS'')');
/**************************************************************************/
GO
IF OBJECT_ID('viewx_CORRICA', 'v') IS NOT NULL
DROP VIEW viewx_CORRICA
GO
CREATE VIEW viewx_CORRICA AS
SELECT GHZORI AS Armazem,
       GHNEMP AS Localizacao,
       LBLBNB AS Etiqueta,
       GHLIB5 AS Artigo,           
       LBQTYD AS Quantidade 
FROM OpenQuery(MACPAC, 'SELECT GA160H.LBLBNB, GA160H.GHLIB5, GA160H.GHZORI, GA160H.GHNEMP, GA160M.LBQTYD
FROM D805DATPOR.GA160H GA160H, D805DATPOR.GA160M GA160M
WHERE GA160M.LBLBNB = GA160H.LBLBNB AND (GA160H.GHZORI=''CORRICA'' AND GA160H.GHCSTA=''DIS'')');

然后在需要时,根据用户等级选择视图,并从中返回我需要的东西

GO
IF OBJECT_ID('dbo.spx_SELECT_RandomLocalizacoes') IS NOT NULL
DROP PROCEDURE spx_SELECT_RandomLocalizacoes
GO
CREATE PROCEDURE spx_SELECT_RandomLocalizacoes
    @LocalizacoesMax int,   
    @Armazem int
AS
BEGIN
SET NOCOUNT ON  

DECLARE @Output int




IF ( @Armazem = 'POE' )
    BEGIN
        SELECT TOP(10) xa.IdArmazem, vpoe.Localizacao, vpoe.Etiqueta, vpoe.Artigo, vpoe.Quantidade 
        FROM viewx_POE vpoe
        INNER JOIN xArmazem xa 
        ON vpoe.Armazem = xa.Armazem
        ORDER BY NEWID()
    END
    ELSE IF ( @Armazem = 'CORRICA' )
    BEGIN
        SELECT TOP(@LocalizacoesMax) * FROM viewx_CORRICA ORDER BY NEWID()
    END

END