การเข้าร่วมที่ไม่ซ้ำ: 2 คีย์หลักในหนึ่งคอลัมน์

ปัญหาที่ฉันพบคือการทำงานกับ 3 ตารางลูกค้า การซื้อ และเวิร์กโฟลว์

CustomerID เป็นคีย์หลักสำหรับตารางลูกค้าและเป็น INT EG.. 123 ที่มีตัวเลข 3 หลัก

PurchaseID เป็นคีย์หลักสำหรับตารางการซื้อคือ INT 8 หลัก 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

คีย์หลักสำหรับ 2 ตารางนี้ผสมอยู่ในคอลัมน์รหัสเอนทิตีเดียว และนี่ทำให้ฉันเข้าร่วมได้ยากมาก ฉันจัดการเพื่อเข้าร่วมในคำสั่งเคสหลังจาก (ON Workflow.EntityID =) ซึ่งมีลักษณะเช่นนี้

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

แต่ข้อความค้นหาที่ฉันใช้อยู่นั้นช้ามากและไม่ตอบสนองจนไม่ใช่วิธีแก้ปัญหาจริงๆ

มีใครเคยมีประสบการณ์อื่นใดกับการรวมประเภทนี้โดยที่คอลัมน์รวมคีย์หลัก 2 อันจากตารางที่แยกกันหรือไม่

ฉันพลาดบางสิ่งบางอย่างที่ชัดเจนไปหรือเปล่า?


person user1653447    schedule 18.02.2014    source แหล่งที่มา
comment
ฉันขอแนะนำให้เปลี่ยนสคีมาเวิร์กโฟลว์เป็น WFID, CustomerID, PurchaseID, Type, Ref   -  person Utku Yıldırım    schedule 18.02.2014


คำตอบ (2)


เงื่อนไขเช่นนั้นใน 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

เครื่องยนต์สามารถเพิ่มประสิทธิภาพสิ่งเหล่านี้ได้ดีขึ้นมาก

person Gordon Linoff    schedule 18.02.2014
comment
ขอบคุณ. ดูมั่นคงกว่าที่ฉันเคยมีมาก - person user1653447; 19.02.2014

คุณสามารถใช้สหภาพที่จะทำงานเดียวกันได้ สิ่งนี้จะได้ผล แต่การออกแบบตารางของคุณไม่ค่อยดีนัก คุณควรพิจารณาการออกแบบ db อีกครั้งในกรณีนี้

--query--
where ref = 1 and Workflow.EntityID = customer.customerID
union all
--query--
where ref = 2 and Workflow.EntityID = purchase.purchaseID
person Dumitrescu Bogdan    schedule 18.02.2014
comment
UNION เป็นสิ่งที่ฉันได้ลองแล้ว แต่เนื่องจากฉันมีหลายอินสแตนซ์ในตารางเวิร์กโฟลว์และไม่มีทางซ้ำกัน ฉันจึงได้รับรายการซ้ำเมื่อรายงาน ขอบคุณ - person user1653447; 19.02.2014
comment
UNION จะให้ผลลัพธ์เหมือนกับการรวม 2 รายการ แต่ใช้พื้นที่หน่วยความจำน้อยกว่าและโดยทั่วไปจะมีความเร็วที่เร็วกว่า นอกจากนี้ยังจะเก็บชุดผลลัพธ์เดียวกันกับแบบสอบถามดั้งเดิม - person Dumitrescu Bogdan; 19.02.2014