2010-01-21 7 views
11

Tôi có hai bảng hiện có, với các trường khác nhau, ngoại trừ ID chính (một varchar, không phải là int). Tôi muốn tạo một bảng thứ ba về cơ bản là sự hợp nhất của hai bảng này, như vậy đối với một khóa chính đã cho, tôi có tất cả các trường trong một bảng.MySQL - Cách tạo bảng mới tham gia khóa chính của hai bảng hiện có

Cách nào để làm điều này?

Rất cám ơn

+1

Bạn có chắc chắn bạn muốn có một bảng (có chứa một bản chụp của dữ liệu hiện tại trong bảng của bạn và sẽ không phản ánh những thay đổi trong tương lai)? Không phải bạn đang tìm kiếm một cái nhìn (mà luôn luôn nhìn vào dữ liệu hiện tại trong bảng)? –

+0

Hi Bandi-T - đó là một suy nghĩ tốt, và trong thực tế, suy nghĩ về nó có lẽ tôi không cần phải hợp nhất chúng. Tuy nhiên, dữ liệu là hợp lý tĩnh, sẽ chỉ được cập nhật hàng loạt mỗi tháng hoặc lâu hơn. –

+0

tốt, nếu bạn chọn một bảng, DBMS chỉ tính toán một lần và không thực hiện theo các thay đổi trong dữ liệu nguồn. Nếu bạn chọn chế độ xem, DBMS sẽ tính toán mỗi khi có ai đó truy vấn chế độ xem đó nhưng sẽ luôn chứa dữ liệu mới. Nếu bạn phải thực hiện nhiều truy vấn về dữ liệu đã hợp nhất này (tôi đoán bạn sẽ truy vấn thường xuyên hơn các cập nhật xảy ra), thì có thể rất đáng để chọn sử dụng bảng. –

Trả lời

2

Nếu bạn chắc chắn có một và chính xác một hàng trong cả hai bảng cho một ID chính nhất định, sau đó điều này sẽ làm việc:

SELECT 
    tablea.field1, tablea.field2, tablea.field3, ... tablea.fieldn, <---- field list 
    tableb.field1, tableb.field2, tableb.field3, ... tableb.fieldm <---- field list 
FROM 
    tablea, tableb 
WHERE 
    tablea.primaryID = tableb.primaryID 

Bạn có thể muốn bỏ qua TableA và của TableB trường ID chính từ danh sách trường nếu bạn không thực sự cần chúng (trong truy vấn này cả hai sẽ chứa cùng một giá trị do điều kiện tablea.primaryID = tableb.primaryID).

Cú pháp tương đối giống với một VIEW.

+0

Có khá chắc chắn rằng chỉ có một hàng cho một PID nhất định trong mỗi bảng. PID được thiết lập như là PRIMARY KEY - có lẽ MySQL sẽ cấm nhập nếu có dupe? –

+0

@Richard: Vâng, đúng vậy. Tuy nhiên, đối với truy vấn trên để cung cấp cho tất cả các hàng của bạn chính xác một lần, bạn cũng phải đảm bảo các hàng (bản ghi) có thể được kết hợp chính xác 1: 1 với nhau trong hai bảng.Nếu bạn có một khóa chính cho biết 3 trong một bảng, nhưng không có khóa chính 3 trong bảng khác, sẽ không có hàng với '3' trong kết quả, bởi vì không có hàng' 3' khớp trong bàn khác. –

26
CREATE TABLE result AS 
    (SELECT first.*, 
      second.f1, 
      second.f2, 
      second.f3 
    FROM first 
      INNER JOIN second 
        ON first.id = second.id); 

Để có chế độ xem, hãy làm tương tự ngoại trừ thay thế "BẢNG" bằng "XEM". Nếu bạn đi với bảng chứ không phải là chế độ xem, hãy đảm bảo thêm khóa chính vì khóa đó sẽ không được thêm theo mặc định.

+0

Câu trả lời chính xác! – HPM

0

Tại sao bạn tạo bảng mới? Tại sao bạn không thực hiện truy vấn bất cứ khi nào bạn cần dữ liệu? Nếu bạn chỉ tham gia hai bảng trên khóa chính của họ, thì phần lớn thời gian truy cập dữ liệu của bạn sẽ được sử dụng để sửa đổi dữ liệu trở lại ứng dụng của bạn. Bạn sẽ không tiết kiệm được nhiều thời gian trước khi gia nhập các bảng, và bạn sẽ ăn nhiều không gian. Thêm vào đó, bạn đang nhắm vào ngón cái lớn của mình, chỉ cần đợi lần đầu tiên bạn cập nhật các bảng nguồn của mình và quên chạy tập lệnh cập nhật để sao chép các thay đổi vào bảng đã tham gia của bạn. Dữ liệu trùng lặp là ác, nhưng đôi khi cần thiết. Điều này không có vẻ giống như một trong những lần đó.

0

Đối với MS SQL sử dụng này

SELECT * INTO result 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.id