我遇到的问题是使用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
但是我正在运行的查询变得如此缓慢且无响应,以至于它不是真正的解决方案。
有没有人对这些类型的联接有任何其他经验,其中一列结合了来自不同表的两个主键的混合?
我错过了一些明显的东西吗?
答案 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