Tôi nghĩ vấn đề chính là không phải tất cả các cơ sở dữ liệu đều hỗ trợ Biểu thức bảng chung.
Chủ nhân của tôi sử dụng DB / 2 cho rất nhiều thứ. Các phiên bản mới nhất của nó hỗ trợ CTE, như vậy tôi có thể làm những việc như:
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
Kết quả là chúng ta có thể có các tên bảng / trường được viết tắt nhiều và về cơ bản tôi đang tạo các chế độ xem tạm thời, với các tên dễ đọc hơn, sau đó tôi có thể sử dụng. Chắc chắn, truy vấn sẽ lâu hơn. Nhưng kết quả là tôi có thể viết một cái gì đó tách biệt rõ ràng (sử dụng CTE theo cách bạn sử dụng các chức năng để có được DRY) và kết thúc bằng mã khá dễ đọc. Và bởi vì tôi có thể thoát ra các truy vấn con của mình và có một tham chiếu truy vấn con khác, nên nó không phải là "nội tuyến". Đôi khi, tôi đã viết một CTE, sau đó có bốn CTE khác đều tham chiếu nó, sau đó có kết hợp truy vấn chính kết quả của bốn CTE cuối cùng.
Điều này có thể được thực hiện với:
- DB / 2
- PostGreSQL
- Oracle
- Máy chủ MS SQL
- MySQL (phiên bản mới nhất; vẫn còn mới)
- có lẽ là những người khác
Nhưng nó đi một cách lâu dài để làm cho mã sạch hơn, dễ đọc hơn, KHÔ hơn.
Tôi đã phát triển một "thư viện chuẩn" của CTE mà tôi có thể cắm vào các truy vấn khác nhau, giúp tôi bắt đầu bay vào truy vấn mới của mình. Một số trong số họ cũng bắt đầu được các nhà phát triển khác trong tổ chức của tôi chấp nhận.
Theo thời gian, có thể có ý nghĩa để biến một số trong số này thành các chế độ xem, sao cho "thư viện chuẩn" này có sẵn mà không cần phải sao chép / dán. Nhưng các CTE của tôi cuối cùng đã bị điều chỉnh, dù chỉ một chút, cho các nhu cầu khác nhau mà tôi không thể có một CTE duy nhất được sử dụng SO WIDELY, mà không có mod, có thể đáng để tạo một chế độ xem.
Dường như một phần trong sự kìm kẹp của bạn là "tại sao tôi không biết về CTE?" hoặc "tại sao DB của tôi không hỗ trợ CTE?"
Đối với các cập nhật ... vâng, bạn có thể sử dụng CTE nhưng, theo kinh nghiệm của tôi, bạn phải sử dụng chúng trong mệnh đề set VÀ trong mệnh đề where. Sẽ thật tuyệt nếu bạn có thể định nghĩa một hoặc nhiều hơn trước toàn bộ câu lệnh cập nhật và sau đó chỉ có các phần "truy vấn chính" trong tập hợp / mệnh đề nhưng nó không hoạt động theo cách đó. Và không tránh được tên bảng / trường tối nghĩa trên bảng bạn đang cập nhật.
Bạn có thể sử dụng CTE để xóa. Có thể mất nhiều CTE để xác định giá trị PK / FK cho các bản ghi bạn muốn xóa khỏi bảng đó. Một lần nữa, bạn không thể tránh các tên bảng / trường tối nghĩa trên bảng bạn đang sửa đổi.
Khi bạn có thể chọn vào một phần chèn, bạn có thể sử dụng CTE để chèn. Như mọi khi, bạn có thể xử lý các tên bảng / trường tối nghĩa trên bảng bạn đang sửa đổi.
SQL KHÔNG cho phép bạn tạo tương đương với một đối tượng miền, bao bọc một bảng, với getters / setters. Vì thế, bạn sẽ cần sử dụng một loại ORM nào đó, cùng với ngôn ngữ lập trình / OO mang tính thủ tục hơn. Tôi đã viết những thứ thuộc về bản chất này bằng Java / Hibernate.