Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Desain tabel dinamis (tabel pencarian umum), perlu kueri yang bagus untuk mendapatkan nilai

Pada awalnya kami memiliki ini -- yang cukup berantakan.

Untuk membersihkan sedikit saya menambahkan dua tampilan dan sinonim:

create view v_Value as
select
      ID                      as ValueID
    , tb_modules_ID           as ModuleID
    , usertype_OR_religion_ID as RemoteID
from tb_value ;
go

create view v_Religion as
select
      ID
    , ReligionName as Title
from tb_religion ;
go

create synonym v_UserType for tb_UserType ;
go

Dan sekarang modelnya terlihat seperti

Sekarang lebih mudah untuk menulis kueri

;
with 
q_mod as (
    select
          m.ID                          as ModuleID
        , coalesce(x1.ID    , x2.ID)    as RemoteID
        , coalesce(x1.Title , x2.Title) as Title
        , m.Description                 as ModuleType
    from      tb_Modules as m
    left join v_UserType as x1 on m.TableName = 'tb_UserType'
    left join v_Religion as x2 on m.TableName = 'tb_Religion'
)
select
      a.ModuleID
    , v.ValueID
    , a.RemoteID
    , a.ModuleType
    , a.Title
from q_mod   as a
join v_Value as v on (v.ModuleID = a.ModuleID and v.RemoteID = a.RemoteID) ;

Ada pola yang jelas dalam kueri ini, sehingga dapat dibuat sebagai sql dinamis jika Anda harus menambahkan tabel tipe modul lain. Saat menambahkan tabel lain, gunakan ID dan Title untuk menghindari keharusan menggunakan tampilan.

EDIT

Untuk membangun sql dinamis (atau kueri pada tingkat aplikasi)

Ubah baris 6 dan 7, x-indexnya adalah tb_modules.id

coalesce(x1. , x2. , x3. ..) 

Tambahkan baris ke kiri bergabung (di bawah baris 11)

left join v_SomeName as x3  on m.TableName = 'tb_SomeName'

SomeName adalah tb_modules.description dan x-index cocok dengan tb_modules.id

EDIT 2

Yang paling sederhana mungkin adalah mengemas kueri di atas ke dalam tampilan dan kemudian setiap kali skema berubah secara dinamis, buat dan jalankan ALTER VIEW . Dengan cara ini kueri tidak akan berubah dari sudut pandang aplikasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyegarkan metadata pada fungsi pengguna t-SQL

  2. INSTR() Setara di SQL Server

  3. Ekstrak URL dari situs web?

  4. Pengecualian SQL saat menghubungkan ke server SQL

  5. Ubah smallint menjadi waktu