Những công dụng của Cross Join là gì?


105

Một phép nối chéo thực hiện một tích các-ten trên các bộ giá trị của hai bộ.

SELECT *
FROM Table1
CROSS JOIN Table2

Những trường hợp nào làm cho một hoạt động SQL như vậy đặc biệt hữu ích?


36
Thật sự rất buồn khi câu hỏi này đã được đóng lại. Tôi nghĩ nó có thể được đánh dấu là Wiki Cộng đồng, nhưng nói rằng nó không mang tính xây dựng là không công bằng.
Wayne Koorts

1
Tôi đồng ý. Điều này đã trả lời chính xác câu hỏi mà tôi có.
Hades

10
Đôi khi, một nhà phát triển mới hơn gặp khó khăn khi hiểu ý nghĩa của một số chức năng của phần mềm mà họ đang sử dụng. Những câu hỏi như thế này đặc biệt hữu ích đối với các nhà phát triển mới hơn, chủ yếu vì cuộc thảo luận sau đó làm sáng tỏ nhiều khả năng mà các nhà phát triển cơ sở chưa bao giờ tính đến. Dạng câu hỏi tốt nhất là cơ bản, nhưng ý định có vẻ trung thực ở chỗ nó hỏi "tại sao điều này lại tồn tại?" Tôi đồng ý với Wayne Koorts, thật tiếc khi casperOne đã quyết định đóng nó và gọi nó là "không mang tính xây dựng." Phần "không mang tính xây dựng" đặc biệt làm tôi khó chịu.
Kaorie

Câu trả lời:


93

Nếu bạn có "lưới" mà bạn muốn điền đầy đủ, chẳng hạn như thông tin về kích thước và màu sắc cho một mặt hàng quần áo cụ thể:

select 
    size,
    color
from
    sizes CROSS JOIN colors

Có thể bạn muốn một bảng chứa một hàng cho mỗi phút trong ngày và bạn muốn sử dụng nó để xác minh rằng một thủ tục đã được thực thi mỗi phút, vì vậy bạn có thể gạch chéo ba bảng:

select
    hour,
    minute
from
    hours CROSS JOIN minutes

Hoặc bạn có một tập hợp các thông số kỹ thuật báo cáo tiêu chuẩn mà bạn muốn áp dụng hàng tháng trong năm:

select
    specId,
    month
from
    reports CROSS JOIN months

Vấn đề với việc duy trì những quan điểm này là trong hầu hết các trường hợp, bạn không muốn có một sản phẩm hoàn chỉnh, đặc biệt là đối với quần áo. Bạn có thể thêmMINUS logic vào truy vấn để loại bỏ một số kết hợp nhất định mà bạn không mang theo, nhưng bạn có thể thấy dễ dàng hơn để điền vào bảng theo cách khác và không sử dụng tích Descartes.

Ngoài ra, cuối cùng bạn có thể thử kết hợp chéo trên các bảng có lẽ có nhiều hàng hơn bạn nghĩ, hoặc có lẽ WHEREmệnh đề của bạn bị thiếu một phần hoặc hoàn toàn. Trong trường hợp đó, DBA của bạn sẽ thông báo ngay cho bạn về sự thiếu sót. Thường thì anh ấy hoặc cô ấy sẽ không hạnh phúc.


5
... Trong trường hợp đó, DBA của bạn sẽ thông báo ngay cho bạn về sự thiếu sót. Thường thì anh ấy hoặc cô ấy sẽ không hạnh phúc. ... haha, quá đúng!
RSW

2
@Dave: Chẳng phải ví dụ thứ hai chỉ là giờ CROSS THAM GIA phút sao?
Rakesh

@Rakesh, bắt tốt, tôi đang nghĩ về điều gì đó khác với những gì tôi đang nhập. Đã sửa.
Dave DuPlantis

1
Tôi có thể tưởng tượng việc tham gia chéo là rất thực tế nếu bạn được cung cấp 2 bộ id (có lẽ ở định dạng csv), một bộ sẽ chứa id nhân viên và bộ kia sẽ chứa id nhiệm vụ. Ý tưởng là bạn có một bảng M2M cho EmployeeTask. Bạn có thể sử dụng kết hợp chéo để giao mọi nhiệm vụ nhất định cho mọi nhân viên nhất định, với điều kiện là bạn đã chuyển csv thành các biến bảng (hoặc một cái gì đó).
SynBiotik

20

Tạo dữ liệu để thử nghiệm.


Tôi chưa bao giờ nghĩ rằng mình sẽ thấy một "câu trả lời" 4 từ nhận được 9 phiếu tán thành.
mickmackusa

14

Bạn thường sẽ không muốn có một sản phẩm Descartes đầy đủ cho hầu hết các truy vấn cơ sở dữ liệu. Toàn bộ sức mạnh của cơ sở dữ liệu quan hệ là bạn có thể áp dụng bất kỳ hạn chế nào mà bạn có thể quan tâm để cho phép bạn tránh kéo các hàng không cần thiết khỏi db.

Tôi giả sử một ví dụ giả định mà bạn có thể muốn đó là nếu bạn có một bảng nhân viên và một bảng công việc cần làm và muốn xem tất cả các nhiệm vụ có thể có của một nhân viên cho một công việc.


11

Ok, điều này có thể sẽ không trả lời câu hỏi, nhưng, nếu nó là sự thật (và tôi thậm chí không chắc về điều đó) thì đó là một chút thú vị của lịch sử.

Trong những ngày đầu của Oracle, một trong những nhà phát triển nhận ra rằng anh ta cần phải sao chép mọi hàng trong một bảng (ví dụ, có thể đó là một bảng các sự kiện và anh ta cần thay đổi nó thành "sự kiện bắt đầu" và "sự kiện kết thúc" riêng biệt. mục). Anh ta nhận ra rằng nếu anh ta có một bảng chỉ có hai hàng, anh ta có thể thực hiện phép nối chéo, chỉ chọn các cột trong bảng đầu tiên và nhận được chính xác những gì anh ta cần. Vì vậy, anh ấy đã tạo ra một chiếc bàn đơn giản, mà anh ấy gọi là "KÉP" một cách tự nhiên.

Sau đó, anh ta cần phải làm một việc gì đó mà chỉ có thể được thực hiện thông qua lựa chọn từ một bảng, mặc dù bản thân hành động đó không liên quan gì đến bảng, (có lẽ anh ta đã quên đồng hồ và muốn đọc thời gian thông qua CHỌN SYSDATE FROM .. .) Anh ấy nhận ra rằng anh ấy vẫn còn chiếc bàn KÉP của mình nằm xung quanh, và sử dụng nó. Sau một thời gian, anh ta cảm thấy mệt mỏi khi nhìn thấy thời gian được in hai lần, vì vậy anh ta cuối cùng đã xóa một trong các hàng.

Những người khác tại Oracle bắt đầu sử dụng bảng của anh ấy, và cuối cùng, họ đã quyết định đưa nó vào cài đặt Oracle tiêu chuẩn.

Điều này giải thích tại sao một bảng có ý nghĩa duy nhất là nó có một hàng có tên có nghĩa là "hai".


8

Điều quan trọng là "chỉ cho tôi tất cả các kết hợp có thể có". Tôi đã sử dụng chúng kết hợp với các trường được tính toán khác, sau đó sắp xếp / lọc chúng.

Ví dụ: giả sử bạn đang xây dựng một ứng dụng chênh lệch giá (giao dịch). Bạn có người bán cung cấp sản phẩm ở mức giá và người mua yêu cầu sản phẩm với mức giá. Bạn thực hiện kết hợp chéo trên khóa sản phẩm (để so khớp người mua và người bán tiềm năng), tính toán chênh lệch giữa chi phí và giá cả, sau đó sắp xếp mô tả. về điều này để cung cấp cho bạn (người trung gian) các giao dịch có lợi nhất để thực hiện. Tất nhiên, hầu như lúc nào bạn cũng có các tiêu chí lọc giới hạn khác.


Ah! Lời giải thích này có ý nghĩa nhất đối với tôi. Trong trường hợp này, INNER JOIN không có ý nghĩa gì vì không có mối quan hệ nào giữa ID sản phẩm và người bán, vì nhiều người bán có thể bán cùng một sản phẩm.
moonman239

3

Sử dụng một cái gì đó giống như một bảng chữ số, có mười hàng cho các chữ số 0-9. Bạn có thể sử dụng kết hợp chéo trên bảng đó một vài lần để nhận được kết quả có bao nhiêu hàng bạn cần, với các kết quả được đánh số thích hợp. Điều này có một số cách sử dụng. Ví dụ: bạn có thể kết hợp nó với một hàm datadd () để lấy một tập hợp cho mỗi ngày trong một năm nhất định.



1

Hãy tưởng tượng bạn có một loạt các truy vấn mà bạn muốn đưa ra trên một tổ hợp các mặt hàng và ngày cụ thể (giá cả, tình trạng còn hàng, v.v.). Bạn có thể tải các mục và ngày tháng vào các bảng tạm thời riêng biệt và để các truy vấn của bạn kết hợp chéo với các bảng. Điều này có thể thuận tiện hơn so với việc liệt kê các mục và ngày tháng trong mệnh đề IN, đặc biệt là vì một số cơ sở dữ liệu giới hạn số phần tử trong mệnh đề IN.


1

bạn có thể sử dụng nó CROSS JOIN để: - tạo dữ liệu cho mục đích thử nghiệm - kết hợp tất cả các thuộc tính - bạn cần tất cả sự kết hợp có thể có, ví dụ như nhóm máu (A, B, ..) với Rh - / +, v.v. - từ đó cho mục đích của bạn;) - Tôi không phải là chuyên gia trong lĩnh vực này;)

CREATE TABLE "HR"."BL_GRP_01" 
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);

CREATE TABLE "HR"."BL_GRP_02" 
("GR_1" VARCHAR2(5 BYTE));

REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);

CREATE TABLE "HR"."RH_VAL_01" 
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);

select distinct  a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;
  • tạo liên kết cho 2 bảng mà không có id chung rồi nhóm nó bằng cách sử dụng max (), v.v. để tìm kết hợp cao nhất có thể
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.