创建来自两个不同系统的两个相同表的视图以仅返回唯一记录

Posted

技术标签:

【中文标题】创建来自两个不同系统的两个相同表的视图以仅返回唯一记录【英文标题】:Create View of two identical tables from two seperate systems to return only unique records 【发布时间】:2013-09-20 20:26:19 【问题描述】:

我有两个系统在相同的数据库上运行相同的软件。对于报告,我需要报告票务表。 我链接了两台服务器并在两个票证表之间创建了一个联合,但我仍然得到重复的记录。该软件确实在两个系统之间复制票证数据,但这是“预”复制的报告,这意味着

我需要工单表 A 中的所有工单,我只需要工单表 B 中我还没有的记录。在这种情况下,票号是唯一的。我正在使用这些表格中的几个列,例如车辆 ID、客户名称、价格、数量等。还有许多公式。将它们全部命名确实很广泛。是否有另一种方法可以将两个表中的所有列都放入一个视图中,但只能看到 distnct 记录

我试图创建这样的视图:

CREATE VIEW  vw_combinedtickettable as
SELECT * 
FROM dbo.Ticket
UNION
SELECT *  from LinkedServer.Database2.dbo.ticket

仅使用union 而不是union all 进行思考会起作用,但事实并非如此。

任何帮助都会很棒。

【问题讨论】:

你试过不存在或不存在吗? union 应该返回唯一的行集,而 union all 将返回重复的行集。您的两个数据库之间是否还有其他一些列不相同,其他所有情况都相同? 【参考方案1】:
SELECT  * 
FROM    dbo.Ticket
UNION ALL
SELECT  *
FROM    LinkedServer.Database2.dbo.ticket
WHERE   ticketNumber NOT IN
        (
        SELECT  ticketNumber
        FROM    dbo.Ticket
        )

【讨论】:

我仍然使用上面的 SQL 得到重复。我不明白为什么。我无法支持它,因为当数字为 34555 和 1234555 时这会导致麻烦。它会抑制两者。【参考方案2】:

你可以试试:

    CREATE VIEW vw_combinedtickettable AS
    SELECT * FROM dbo.Ticket t1
    UNION ALL
    SELECT t2.* FROM dbo.Ticket t1
    LEFT JOIN LinkedServer.Database2.dbo.ticket t2
    ON t1.id = t2.id
    AND t1.id IS NULL

希望这会有所帮助!

【讨论】:

我试过这个,它抛出了一个错误。每个视图或函数中的列名必须是唯一的。视图或函数 vw_combinedtickettable 中的列名“TicketType”被指定了多次。 当然很抱歉,atm 无法测试。我已经修改了我的答案,希望能给你想要的输出。

以上是关于创建来自两个不同系统的两个相同表的视图以仅返回唯一记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 在视图中使用交叉引用两个表的结果创建列

唯一标识两个不同的视图

连接来自两个不同表的两列

来自两个不同数据库表的Fullcalendar事件具有相同的ID

连接来自不同数据库的同名表的结果

在两个不同的表中创建具有相同列的视图 SQL