唯一加入:一列的2个主键

时间:2014-02-18 15:38:55

标签: sql sql-server join primary-key

我遇到的问题是使用3个表Customer,Purchase和Workflow。

CustomerID是Customer Table的主键,是一个3位INT EG .. 123

PurchaseID是购买表的主键,是8位INT EG .. 12345678

工作流程保存用户当时正在运行的工作流程的详细信息。根据任务,它可以变化。它可能看起来像这样。

WFID    EntityID        Type        Ref

771     123             Customer    1
772     12345678        Purchase    2
773     124             Customer    1
774     125             Customer    1
775     12345679        Purchase    2

这两个表的主键混合到单个entityID列中,这使我很难加入。我已经设法在(ON Workflow.EntityID =)之后加入一个case语句,看起来像这样。

ON Workflow.EntityID =)
Case    when ref = 1 THEN customer.customerID
    When ref = 2 THEN purchase.purchaseID
END

但是我正在运行的查询变得如此缓慢且无响应,以至于它不是真正的解决方案。

有没有人对这些类型的联接有任何其他经验,其中一列结合了来自不同表的两个主键的混合?

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:3)

join这样的情况使得优化查询变得非常困难。尝试将其写为两个单独的连接:

from workflow wf left outer join
     customer c
     on c.customerID = wf.EntityID and wf.ref = 1 left outer join
     purchase p
     on p.purchaseID = wf.EntityID and wf.ref = 2

引擎可以更好地优化这些。

答案 1 :(得分:0)

您可以使用将执行相同工作的联合。这样可行,但是你的表的设计并不是那么好。在这种情况下,您应该重新考虑数据库设计。

--query--
where ref = 1 and Workflow.EntityID = customer.customerID
union all
--query--
where ref = 2 and Workflow.EntityID = purchase.purchaseID