Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thiết kế bảng động (bảng tra cứu chung), cần một truy vấn đẹp để nhận các giá trị

Lúc đầu, chúng ta có cái này - khá lộn xộn.

Để làm rõ một chút, tôi thêm hai chế độ xem và một từ đồng nghĩa:

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

Và bây giờ mô hình trông giống như

Giờ đây, viết truy vấn dễ dàng hơn

;
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) ;

Có một mẫu rõ ràng trong truy vấn này, vì vậy nó có thể được tạo dưới dạng sql động nếu bạn phải thêm một bảng kiểu mô-đun khác. Khi thêm một bảng khác, hãy sử dụng IDTitle để tránh phải sử dụng chế độ xem.

CHỈNH SỬA

Để tạo sql động (hoặc truy vấn ở cấp ứng dụng)

Sửa đổi dòng 6 và 7, chỉ số x là tb_modules.id

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

Thêm dòng vào phần nối bên trái (bên dưới dòng 11)

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

SomeNametb_modules.description và x-index khớp với tb_modules.id

CHỈNH SỬA 2

Đơn giản nhất có thể là gói truy vấn ở trên vào một dạng xem và sau đó mỗi khi lược đồ thay đổi thùng động và chạy ALTER VIEW . Bằng cách này, truy vấn sẽ không thay đổi so với điểm của ứng dụng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn cơ sở dữ liệu chéo với các tên DB khác nhau trong các môi trường khác nhau?

  2. Lỗi máy chủ SQL:ExecuteNonQuery:Thuộc tính kết nối chưa được khởi tạo

  3. Bỏ tất cả các bảng tạm thời cho một phiên bản

  4. SSRS - Group_Concat Tương đương sử dụng Biểu thức?

  5. Câu lệnh SELECT chỉ định giá trị cho một biến không được kết hợp với các hoạt động truy xuất dữ liệu