如何查询是否不知道哪个表有数据?

时间:2014-09-03 21:00:59

标签: sql sql-server stored-procedures

我有以下表格:

TableADateOrderNumRejectionType

TableBOrderNumMaterialNumSize

TableCMaterialNumCost

TableB2OrderNoMaterialNoSize

TableC2MaterialNumCost

TableA总是会有Date的多行,而在OrderNum的多行中,某些OrderNum存在于TableB中,有些存在于TableB2,我们不知道。 TableBTableB2中的每一行都符合MaterialNum,我们不知道它位于TableCTableC2

而且,尽管TableB中的OrderNum具有与OrderNo TableB2相同的属性,但由于列名称不同,我不能使用(... Union ...) As b where b.OrderNum = a.OrderNum

如何查询以便我可以获得以下列

Date,OrderNum,RejectionType,MaterialNum,Size,Cost

where TableA.Date = @Date

谢谢!

1 个答案:

答案 0 :(得分:0)

由于您的备用表TableB2TableC2TableA位于不同的物理服务器上,因此您无法在纯MySQL方言SQL中执行此操作,除非你可以构建一个联邦数据库。

这是一项艰巨的任务,你应该向https://dba.stackexchange.com/提出如何解决这个问题。

原始提问者。我正在使用Microsoft SQL Server管理工作室2008,我已经连接了两台服务器。我想一旦联系起来,我能做到吗?

Ollie Jones:只要你能在SQL语句中做这样的事情,你就可以做到这一点。

SELECT A.Date, A.OrderNum, A.RejectionType,
       Q.Source, Q.MaterialNum, Q.Size
  FROM Server1.TableA AS A
  LEFT JOIN  (
          SELECT 'Primary' AS Source,
                 OrderNum, 
                 MaterialNum, Size
            FROM Server1.TableB
           UNION ALL  /* pulls together contents from two tables */
          SELECT 'Secondary' AS Source,
                 OrderNo AS OrderNum,  /* alias makes column names conform in UNION */ 
                 MaterialNum, Size
            FROM Server2.TableB2
        ) AS Q ON Q.OrderNum = A.OrderNum
 WHERE TableA.Date = @Date

我创建的Source列在结果集中显示PrimarySecondary,以指示信息来自TableB还是TableB2。如果你不想要它,你绝对不需要使用它。