Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Kết hợp hai bảng không có trường chung

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ần
parts:              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ể 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tốt để cắt tất cả các ký tự khoảng trắng khỏi một chuỗi trong T-SQL mà không có UDF và không có CLR là gì?

  2. SQL Server ORDER THEO ngày tháng và giá trị rỗng cuối cùng

  3. Cách cài đặt sqlcmd &bcp trên Ubuntu

  4. Chèn tất cả các giá trị của một bảng vào một bảng khác trong SQL

  5. Cách di chuyển công việc máy chủ SQL từ một phiên bản máy chủ SQL sang phiên bản khác