vấn đề ở đây là mình chẳng làm gì hết, chẳng có Order by gì cả mà trong query Union của nhà lại bị xắp sếp , trong khi các hạng mục cây cối , công trình phụ không bị sắp xếp, mình có thử dùng autonumber rồi vẫn không được !
- Mặc định là sắp xếp by
Index key (PK or FK) (Kể cả không có Order By - đó là lý thuyết về CSDL)
- Khi lập trình (nhất là lúc viết SQL) thì ko nên để ý tới trường ID (Auto Number) làm gì cả vì trường đó chả có ý nghĩa gì.
- Union là ghép 2 data results lại với nhau, ko có khái niệm "Union của nhà" với "Union của hạng mục cây cối, công trình phụ". Chỉ có khái niệm (Cấu trúc Nhà) Union All (Cấu trúc Cây cối) Union All (Cấu trúc Công trình phụ) mà thôi
- Ta có thể SELECT * FROM ((SELECT Nhà's FieldList FROM tb_Nhà) UNION ALL (SELECT Cây's FieldList FROM tb_Cây) UNION ALL (SELECT CTPhu's FieldList FROM tb_CTPhu)) AS tb_UnionResult ORDER BY ...
Chú ý: Đừng có Order By cái ID Auto Number vì cái đó là vô nghĩa
Đáng ra nếu thiết kế xịn thì phải thiết kế dạng Sub Objects như sau
tb_GenericObject
ID (PK)
----------
Code
ObjectType: (01: Nhà, 02: Cây cối, 03: Công trình phụ....)
Name
....
Note
tb_House <-- Gọi là Sub Object của
tb_GenericObject
ID (PK) -- Reference with
tb_GenericObject by ID (Relation
1-1, cascade delete + update)
Other house's fields
....
tb_Tree
ID (PK) -- Reference with
tb_GenericObject by ID
Other Tree's fields
....
Nếu thiết kế kiểu hướng đối tượng như vậy thì rất dễ làm (Cũng như việc thiết kế các chứng từ vậy: Chứng từ nào cũng có ID, Số chứng từ, Ngày chứng từ, Người tạo, Ngày tạo, Người sửa, Ngày sửa,..., Diễn giải --> Gọi là tb_BaseTransaction. Từ TB_BaseTranasction mới có Invoices, Bills, v.v... ==> Đó mới là thiết kế .... XỊN
không biết sau khi mình kết hợp lại thì Union query phần Nhà lại bị đảo lộn trật tự so với phần gốc.
Bây giờ bạn cần học cách phát biểu yêu cầu, ví dụ:
Trước kia:
[Nhà] được sắp xếp theo thứ tự (cụ thể là theo ID - Auto Number)
[Cây] được sắp xếp theo thứ tự (cụ thể là theo ID - Auto Number)
[Công trình phụ] được sắp xếp theo thứ tự (cụ thể là theo ID - Auto Number)
Sau khi thực hiện UNION ALL như sau:
[Nhà] ghép với [Cây] ghép với [Công trình phụ]
Thì:
Kết quả là Thứ tự của [Nhà], [Cây], [Công trình phụ] không còn như cũ nữa
Mong muốn kết quả được sắp xếp sau khi Union sẽ là:
1. [Nhà]
2. [Cây]
3. [Công trình phụ]
Nếu muốn như thế thì:
SELECT * FROM
(
(SELECT 1 AS STT, ID, Name,.... FROM tb_Nha)
UNION ALL
(SELECT 2 AS STT, ID, Name,.... FROM tb_Cay)
UNION ALL
(SELECT 3 AS STT, ID, Name,.... FROM tb_CTP)
) AS UNION_RESULT_DATA
ORDER BY STT, ID