Có một số cách để thực hiện việc này, tùy thuộc vào những gì bạn thực sự muốn. Không có cột chung, bạn cần quyết định xem bạn muốn giới thiệu một cột chung hay lấy sản phẩm.
Giả sử bạn có hai bảng:
Các phầnparts: custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+
Quên các cột thực tế vì bạn rất có thể có mối quan hệ khách hàng / đơn hàng / bộ phận trong trường hợp này; Tôi vừa sử dụng các cột đó để minh họa các cách thực hiện.
Một sản phẩm của cartesian sẽ khớp mọi hàng trong bảng đầu tiên với mọi hàng trong bảng thứ hai:
> select * from parts, custs;
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
1 Sprocket 102 Paul
2 Flange 101 Bob
2 Flange 102 Paul
Đó có thể không phải là điều bạn muốn vì 1000 bộ phận và 100 khách hàng sẽ dẫn đến 100.000 hàng với nhiều thông tin trùng lặp.
Ngoài ra, bạn có thể sử dụng liên hợp để chỉ xuất dữ liệu, mặc dù không cạnh nhau (bạn sẽ cần đảm bảo các loại cột tương thích giữa hai lựa chọn, bằng cách làm cho các cột trong bảng tương thích hoặc ép buộc chúng trong vùng chọn ):
> select id as pid, desc, null as cid, null as name from parts
union
select null as pid, null as desc, id as cid, name from custs;
pid desc cid name
--- ---- --- ----
101 Bob
102 Paul
1 Sprocket
2 Flange
Trong một số cơ sở dữ liệu, bạn có thể sử dụng cột rowid / rownum hoặc cột giả để khớp các bản ghi song song với nhau, chẳng hạn như:
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob
Mã sẽ giống như sau:
select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;
Nó vẫn như một sản phẩm của cartesian nhưng where
mệnh đề giới hạn cách các hàng được kết hợp để tạo thành kết quả (vì vậy thực sự không phải là một sản phẩm cacte).
Tôi chưa thử nghiệm SQL đó cho điều này vì đó là một trong những hạn chế của lựa chọn DBMS của tôi và đúng như vậy, tôi không tin rằng nó cần thiết trong một lược đồ được suy nghĩ đúng đắn. Vì SQL không đảm bảo thứ tự mà nó tạo ra dữ liệu, đối sánh có thể thay đổi mỗi khi bạn thực hiện truy vấn trừ khi bạn có một cụ thể mối quan hệ hoặc order by
mệnh đề.
Tôi nghĩ điều lý tưởng cần làm là thêm một cột vào cả hai bảng xác định mối quan hệ là gì. Nếu không có mối quan hệ thực sự nào, thì có lẽ bạn chẳng có ích gì khi cố gắng đặt chúng cạnh nhau với SQL.
Nếu bạn chỉ muốn chúng được hiển thị song song trong một báo cáo hoặc trên một trang web (hai ví dụ), thì công cụ phù hợp để làm điều đó là bất cứ thứ gì tạo báo cáo hoặc trang web của bạn, cùng với hai độc lập Truy vấn SQL để lấy hai bảng không liên quan. Ví dụ:mỗi lưới hai cột trong BIRT (hoặc Crystal hoặc Jasper) có một bảng dữ liệu riêng biệt hoặc một bảng hai cột HTML (hoặc CSS) mỗi cột có một bảng dữ liệu riêng biệt.