Gabung Unik: 2 Kunci Utama ke satu kolom

Masalah yang saya alami adalah bekerja dengan 3 tabel Pelanggan, Pembelian, dan Alur Kerja.

CustomerID adalah kunci utama untuk Tabel Pelanggan dan merupakan 3 digit INT EG.. 123

PembelianID adalah kunci utama untuk Tabel Pembelian adalah 8 digit INT EG.. 12345678

Alur kerja menyimpan detail alur kerja yang dijalankan pengguna saat itu. Tergantung pada tugasnya, ini dapat bervariasi. Ini mungkin terlihat seperti ini.

WFID    EntityID        Type        Ref

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

Kunci utama untuk 2 tabel ini dicampur ke dalam kolom ID entitas tunggal dan ini membuat saya kesulitan untuk bergabung. Saya telah berhasil melakukan penggabungan ini pada pernyataan kasus setelah (ON Workflow.EntityID =) yang terlihat seperti ini.

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

Namun kueri yang saya jalankan kemudian menjadi sangat lambat dan tidak responsif sehingga sebenarnya bukan solusi.

Adakah yang punya pengalaman lain dengan jenis gabungan ini, di mana kolom menggabungkan campuran 2 kunci utama dari tabel terpisah?

Apakah saya melewatkan sesuatu yang jelas?


person user1653447    schedule 18.02.2014    source sumber
comment
Saya menyarankan agar mengubah skema Alur Kerja menjadi WFID, ID Pelanggan, ID Pembelian, Tipe, Ref   -  person Utku Yıldırım    schedule 18.02.2014


Jawaban (2)


Kondisi seperti itu di join membuat sangat sulit untuk mengoptimalkan kueri. Cobalah menulisnya sebagai dua gabungan terpisah:

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

Mesin dapat melakukan pekerjaan yang lebih baik dalam mengoptimalkan hal ini.

person Gordon Linoff    schedule 18.02.2014
comment
Terima kasih. Terlihat jauh lebih stabil dibandingkan sebelumnya - person user1653447; 19.02.2014

Anda dapat menggunakan serikat pekerja yang akan melakukan pekerjaan yang sama. Ini akan berhasil, tetapi desain tabel Anda tidak begitu bagus. Anda harus mempertimbangkan kembali desain db dalam kasus ini.

--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 adalah sesuatu yang telah saya coba tetapi karena saya memiliki banyak contoh di tabel Alur Kerja dan tidak unik, saya mendapatkan duplikat saat melaporkan. Terima kasih - person user1653447; 19.02.2014
comment
UNION akan memberi Anda hasil yang sama seperti 2 gabungan, namun dengan jejak memori yang lebih kecil dan biasanya kecepatan lebih cepat. Juga itu akan mempertahankan hasil yang sama seperti kueri asli. - person Dumitrescu Bogdan; 19.02.2014