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ự là muốn. Không có cột phổ biến, bạn cần quyết định xem bạn có muốn giới thiệu một cột chung hay lấy sản phẩm hay không.
Hãy nói rằng bạn có hai bảng:
parts: custs:
+----+----------+ +-----+------+
| id | desc | | id | name |
+----+----------+ +-----+------+
| 1 | Sprocket | | 100 | Bob |
| 2 | Flange | | 101 | Paul |
+----+----------+ +-----+------+
Quên các cột thực tế kể từ khi bạn muốn có khả năng nhất có một khách hàng/đặt hàng/mối quan hệ là một phần trong trường hợp này; Tôi vừa mới sử dụng các cột đó để minh họa các cách để làm điều đó.
Một sản phẩm Descartes sẽ phù hợp với tất cả các hàng trong bảng đầu tiên với tất cả các hàng trong 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ó lẽ không phải những gì bạn muốn từ 1000 các bộ phận và 100 khách hàng sẽ cho kết quả 100.000 hàng với rất nhiều nhân đôi thông tin. Ngoài ra, bạn có thể sử dụng công đoàn để chỉ xuất dữ liệu, mặc dù không phải cạnh nhau (bạn sẽ cần phải đảm bảo các loại cột tương thích giữa hai lựa chọn, hoặc bằng cách làm cho các cột trong bảng tương thích hoặc cố định chúng trong chọn):
> select id as pid, desc, '' as cid, '' as name from parts
union
select '' as pid, '' 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 một rowid/cột rownum hoặc giả cột để phù hợp với hồ sơ side-by-side, chẳng hạn như:
id desc id name
-- ---- --- ----
1 Sprocket 101 Bob
2 Flange 101 Bob
mã sẽ là một cái gì đó như:
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 Descartes nhưng các giới hạn quy định tại khoản where
cách các hàng được kết hợp để tạo kết quả (vì vậy không phải là một sản phẩm Descartes ở tất cả, thực sự).
Tôi chưa thử nghiệm SQL vì đây là một trong những hạn chế của DBMS mà tôi chọn, 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 dữ liệu, kết hợp có thể thay đổi mỗi lần bạn thực hiện truy vấn trừ khi bạn có một mối quan hệ cụ thể hoặc mệnh đề order by
.
Tôi nghĩ điều lý tưởng cần làm là thêm cột vào cả hai bảng chỉ định mối quan hệ là gì. Nếu không có mối quan hệ thực sự, thì có thể bạn không có kinh doanh trong việc 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 báo cáo hoặc trên trang web (hai ví dụ), công cụ phù hợp để làm điều đó là bất cứ điều gì tạo báo cáo hoặc trang web của bạn, cùng với hai độc lập SQL truy vấn để có được hai bảng không liên quan. Ví dụ, một lưới hai cột trong BIRT (hoặc Crystal hoặc Jasper), mỗi bảng 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 bảng có một bảng dữ liệu riêng biệt.
cho những người không thể nghĩ ra một cách sử dụng thực tế hợp lý, hãy tưởng tượng điều này: bạn có một bảng phiếu quà tặng. bạn đang thực hiện một số chỉnh sửa thủ công trên db và bạn muốn đặt trước (đặt ID thành viên cho) N của phiếu thưởng cho N người có trong kết quả truy vấn của bạn. Bạn có thể sử dụng con trỏ, hoặc một ứng dụng được viết bằng ngôn ngữ khác, nhưng một sql sạch với một CTE chỉ phù hợp với các hóa đơn, mà không có bạn rời khỏi phiên SQL của bạn. -và số hàng là cách để đi – SuperDuck
Đây là câu hỏi MySql fav của tôi! – FisherCoder