我有以下表格:
TableA
:Date
,OrderNum
,RejectionType
TableB
:OrderNum
,MaterialNum
,Size
TableC
:MaterialNum
,Cost
TableB2
:OrderNo
,MaterialNo
,Size
TableC2
:MaterialNum
,Cost
TableA
总是会有Date
的多行,而在OrderNum
的多行中,某些OrderNum
存在于TableB
中,有些存在于TableB2
,我们不知道。 TableB
或TableB2
中的每一行都符合MaterialNum
,我们不知道它位于TableC
或TableC2
。
而且,尽管TableB中的OrderNum具有与OrderNo TableB2相同的属性,但由于列名称不同,我不能使用(... Union ...) As b where b.OrderNum = a.OrderNum
如何查询以便我可以获得以下列
Date,OrderNum,RejectionType,MaterialNum,Size,Cost
where TableA.Date = @Date
谢谢!
答案 0 :(得分:0)
由于您的备用表TableB2
和TableC2
与TableA
位于不同的物理服务器上,因此您无法在纯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
列在结果集中显示Primary
或Secondary
,以指示信息来自TableB
还是TableB2
。如果你不想要它,你绝对不需要使用它。