Union Query (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nguyentronghieu876356

Thành viên mới
Tham gia
16/12/08
Bài viết
11
Được thích
0
Mình có file sử dụng union Query , nhưng 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.
Rất mong được các bạn chỉ dẫn!
Chân Thành Cảm Ơn !
 

File đính kèm

Ý bạn là nó không sắp xếp theo số tt
Nếu vậy bạn chèn thêm dòng sau:

ORDER BY [NHA].[SỐ TỰ ĐỘNG];

Thân
 
Không được bạn ơi, mình post lại file đầy đủ hơn, bạn vào đó và nhìn các query thành phần trước và sau đó vào query tổng hợp , tức query Union bạn sẽ thấy trật tự các mục của query đất , cây cối , công trình , phụ và nhà cửa không thay đổi , chỉ có query Nhà là bị đảo lộn, mặc dù query Nhà gốc đã được sắp xếp theo trường Autonumber ! (mình nói trước là sử dụng phương án ORDER BY [NHA].[SỐ TỰ ĐỘNG] là không được !

Mình nghĩ phần Union query chắc ít bạn biết sử dụng, bạn nào nằm được xin chỉ giúp để các bạn trên diễn đàn tăng thêm kiến thức nha !

Cám ơn các bạn rất nhiều !
 

File đính kèm

(mình nói trước là sử dụng phương án ORDER BY [NHA].[SỐ TỰ ĐỘNG] là không được !

Vấn đề là Order By ĐẶT Ở ĐÂU?

Logic nghĩ trong đầu thế nào thì cứ thế mà viết. 1, 3, 5, 7 mà ghép với 2, 4, 6, 8 thì kết quả ghép cuối cùng vẫn không được theo thứ tự. Như vậy, xắp xếp ở kết quả chứ ko sắp xếp ở trước khi có kết quả.

SQL = SQL1 UNION ALL SQL2

SELECT * FROM (SQL) AS UNION_RESULT ORDER BY...

Bài toán thực tế cho vấn đề này chính là việc sắp xếp các chứng từ để tính giá vốn, cần phải biết chứng từ nào xếp trước, chứng từ nào xếp sau để từ đó tính giá vốn cho đúng.
 
Lần chỉnh sửa cuối:
Vậy ý bạn làm thế nào thì bạn làm thử cho mình vào file mình đã post đi , yêu cầu của mình là thứ tự record query thành phần thế nào thì thứ tự record trong query Union như vậy !
Bạn ráng giúp mình nha, cảm ơn bạn nhiều !
 
Mình nghĩ phần Union query chắc ít bạn biết sử dụng, bạn nào nằm được xin chỉ giúp để các bạn trên diễn đàn tăng thêm kiến thức nha !

Chỉ vì tiêu đề topic là Union Query nó ... bình thường quá nên tớ lại ko vào đây đọc bài. Chỉ đến khi topic tương tự xuất hiện bên wkt (nằm ở box mình quản lý) mình mới đọc và trả lời. :) Với lại, ko viết được Union SQL thì chắc chắn sẽ không viết được PM nào tử tế cả.

Vậy ý bạn làm thế nào thì bạn làm thử cho mình vào file mình đã post đi , yêu cầu của mình là thứ tự record query thành phần thế nào thì thứ tự record trong query Union như vậy !
Bạn ráng giúp mình nha, cảm ơn bạn nhiều !

Sorry, từ trước tới giờ tớ lại chưa làm hộ ai sau khi đã chỉ hướng ra rồi (trừ khi không có hướng hoặc việc khó tới mức ko thể làm được, hoặc đó là ... yêu cầu từ khách hàng :P). Chắc sẽ có người khác giúp bạn việc giải quyết cụ thể.

Cheers,

P/S: Việc sắp xếp sau Union tôi đã làm nhiều rồi (đúng theo cách nghĩ ở trên)
 
Lần chỉnh sửa cuối:
Bạn ơi , tới giờ bạn vẫn chưa hiểu ý mình , đã nói bạn tải file mình về coi tường tận đi rồi hãy phát biểu , 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 !
Tớ đã lên diễn đàn hỏi thì cũng đã làm nhiều cách , xem nhiều tài liệu rồi chứ không phải là người dễ nhờ người khác làm giùm như bạn nghĩ đâu, dù sau cũng rất cảm ơn bạn !
 
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
 
Lần chỉnh sửa cuối:
Nói tóm lại, là dùng 1 cái select * (all) trùm ra ngoài tất cả các select (union), order by 1 cái key field chung của tất cả các table (query) thành phần. E rằng không có field này, nhất là mấy cái query con chỉ để chèn dòng trống và chèn dòng tổng.

Còn nói về thiết kế CSDL "Xịn":

Nếu là tôi, thì tôi đã thiết kế như sau: (chưa xem kỹ lắm, nhưng đây là đề nghị cơ bản):

- Có 1 table "Loại công trình" gồm "mã loại" và "tên loại", tên loại là nhà, đất, cây côi, công trình phụ, ...
- Dữ liệu dùng chung 1 table cho mọi công trình và có thêm 1 field "mã công trình" related to cái table trên.
- Những cái query tổng 1, tổng 2, dòng trống, dòng tổng từng loại công trình không cần làm. Ai lại làm riêng 3, 4 cái query cho 3, 4 dòng trống? Rồi lại 3, 4 cái query khác cho 3, 4 cái dòng cộng?
- Tất cả những cái dòng trống, cái tổng con, cái tổng mẹ, hãy để report làm (hãy làm trên report), với chức năng group của report.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom