2010-09-01 39 views
10

Đối với ví dụ tôi không biết bao nhiêu hàng trong mỗi bảng đang có và tôi cố gắng làm như thế này:Các sử dụng câu SELECT có một số lượng khác nhau của cột

SELECT * FROM members 
UNION 
SELECT * FROM inventory 

Những gì tôi có thể đưa vào các thứ hai SELECT thay vì * để xóa lỗi này mà không cần thêm NULL 's?

+6

Tại sao bạn muốn kết hợp hai bảng ngữ cảnh hoàn toàn khác nhau? – Joe

+2

Bạn không bao giờ sử dụng lựa chọn * trong bất kỳ truy vấn nào sẽ chạy trên sản xuất. Bạn nên luôn luôn chỉ định các cột bạn cần cho cả bảo trì và hiệu suất. – HLGEM

Trả lời

9

Đặt tên cột một cách rõ ràng thay vì * và đảm bảo số cột và loại dữ liệu khớp với cùng một cột trong mỗi lựa chọn.

Cập nhật:

Tôi thực sự không nghĩ rằng bạn muốn được UNIONing những bảng, dựa vào tên bảng. Họ dường như không chứa dữ liệu liên quan. Nếu bạn đăng lược đồ của bạn và mô tả những gì bạn đang cố gắng để đạt được nó có khả năng chúng tôi có thể cung cấp trợ giúp tốt hơn.

+0

Tôi không biết gì về bất kỳ tên nào, không có gì. Nó vẫn còn có thể? –

+0

Tại sao điều này lại được bình chọn? –

+1

@hey: Sử dụng 'DESC your_table_name' để tìm hiểu các cột và loại dữ liệu của chúng trước khi viết truy vấn UNION. –

6

bạn có thể làm

SELECT * 
from members 
UNION 
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2 
from inventory; 

đâu membersCol1, membersCol12, vv ... là những cái tên của các cột từ members mà không phải là trong inventory. Bằng cách đó, cả hai truy vấn trong liên minh sẽ có cùng cột (Giả sử rằng tất cả các cột trong inventory giống như trong members dường như rất lạ đối với tôi ... nhưng hey, đó là lược đồ của bạn).

CẬP NHẬT:

Như HLGEM chỉ ra, điều này sẽ chỉ việc nếu inventory có các cột có tên giống như members, và theo thứ tự. Đặt tên tất cả các cột một cách rõ ràng là ý tưởng tốt nhất, nhưng vì tôi không biết tên tôi không thể làm chính xác điều đó. Nếu tôi đã làm, nó có thể trông giống như thế này:

SELECT id, name, member_role, member_type 
from members 
UNION 
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type 
from inventory; 

tôi không thích sử dụng NULL cho các giá trị giả vì sau đó nó không phải luôn luôn rõ ràng đó là một phần của sự kết hợp một kỷ lục đến từ - sử dụng 'giả' làm cho nó rõ ràng rằng hồ sơ là từ một phần của công đoàn mà không có hồ sơ đó (mặc dù đôi khi điều này có thể không quan trọng). Ý tưởng kết hợp hai bảng này dường như rất lạ đối với tôi bởi vì tôi rất nghi ngờ họ sẽ có nhiều hơn 1 hoặc 2 cột cùng tên, nhưng bạn hỏi câu hỏi theo cách mà tôi tưởng tượng trong kịch bản của bạn bằng cách nào đó có ý nghĩa.

+1

Tại sao không sử dụng 'NULL' thay vì 'dummy1' và 'dummy2'? – dan04

+0

Ngay cả khi điều này có hiệu quả, bạn vẫn cần chỉ định tên cột vì các cột có thể hoặc không thể theo cùng thứ tự trên cả hai bảng (hoặc giữ nguyên thứ tự mãi mãi). Cộng với nếu hàng tồn kho sau đó đã có cột anopther được thêm vào, công đoàn sẽ phá vỡ. Không bao giờ thực hiện UNOIN mà không chỉ rõ các cột. Ngoài ra tất cả các công đoàn nên được coi là candiates fro UNION TẤT CẢ đó là nhiều hơn performant nếu không có possiblity của dupes mà cần phải được lọc ra. – HLGEM

+0

Nói làm thế nào để làm điều gì đó rõ ràng là không chính xác là làm tổn thương chap nghèo hỏi câu hỏi, không giúp anh ta. – ErikE

2

Bạn có chắc chắn không muốn tham gia không? Không chắc UNOIN sẽ cung cấp cho bạn những gì bạn muốn cho các tên bảng.

0

Tôi không biết có bao nhiêu hàng trong mỗi bảng

Bạn có chắc chắn đây không phải là những gì bạn muốn?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL 
SELECT 'inventory', Count(*) FROM inventory 
Các vấn đề liên quan