2008-10-20 29 views
79

Kết hợp chéo thực hiện một sản phẩm Descartes trên các bộ dữ liệu của hai bộ.Những công dụng của Cross Join là gì?

SELECT * 
FROM Table1 
CROSS JOIN Table2 

Trường hợp nào khiến hoạt động SQL đặc biệt hữu ích?

+19

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

+0

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

+0

Có những lúc một nhà phát triển mới gặp khó khăn trong việc hiểu được ý nghĩa của một số chức năng nhất định của phần mềm mà họ đang sử dụng. Các câu hỏi như thế này là đặc trưng hữu ích cho các nhà phát triển mới hơn, chủ yếu là vì các cuộc thảo luận sau đây chiếu sáng nhiều khả năng mà các nhà phát triển cơ sở không bao giờ xem xét. Định dạng của câu hỏi là tiểu học, tốt nhất, nhưng ý định dường như trung thực ở chỗ nó hỏi "tại sao điều này thậm chí còn tồn tại?" Tôi đồng ý với Wayne Koorts, đó là một sự xấu hổ mà casperOne bầu để đóng này và gọi nó là "không 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

Trả lời

71

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

select 
    size, 
    color 
from 
    sizes CROSS JOIN colors 

Có lẽ bạn muốn có một bảng có 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 hiện mỗi phút, vì vậy bạn có thể vượt 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 chuẩn mà bạn muốn áp dụng cho mỗi tháng trong năm:

select 
    specId, 
    month 
from 
    reports CROSS JOIN months 

Vấn đề với việc duy trì những điều này là lượt xem là trong hầu hết các trường hợp, bạn không muốn 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êm MINUS logic vào truy vấn để xóa các 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 khi điền bảng theo cách khác và không sử dụng sản phẩm Descartes.

Ngoài ra, bạn có thể sẽ cố gắng tham gia chéo trên các bảng có thể có nhiều hàng hơn bạn nghĩ, hoặc có lẽ mệnh đề WHERE của bạn bị thiếu một phần hoặc toàn bộ. Trong trường hợp đó, DBA của bạn sẽ thông báo cho bạn kịp thời về việc bỏ sót. Thường thì người đó sẽ không hạnh phúc.

+5

_... Trong trường hợp đó, DBA của bạn sẽ thông báo cho bạn kịp thời về việc bỏ sót. Thường thì họ sẽ không được hạnh phúc._ ... haha, thật vậy! – RSW

+2

@Dave: Chẳng phải ví dụ thứ hai chỉ mất vài phút CROSS JOIN phút? – Rakesh

+0

@Rakesh, bắt tốt, tôi đã nghĩ về một cái gì đó khác với những gì tôi đã gõ. Đã sửa. –

12

Thông thường, bạn sẽ không muốn một sản phẩm đầy đủ Descartes 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 việc kéo các hàng không cần thiết khỏi db.

Tôi giả sử một ví dụ mà bạn có thể muốn đó là nếu bạn có 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.

7

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

1

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

9

Ok, điều này có thể sẽ không trả lời được câu hỏi, nhưng, nếu đó là sự thật (và tôi thậm chí không chắc chắn về điều đó) đó là một chút thú vị về 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 cần lặp lại mọi hàng trong bảng (có thể đó là bảng sự kiện và anh cần thay đổi "sự kiện bắt đầu" và "sự kiện kết thúc") . Anh nhận ra rằng nếu anh ta có một cái bàn chỉ với hai hàng, anh ta có thể thực hiện một phép nối chéo, chỉ chọn những cột trong hai cái đầu tiên, và chính xác là anh ta cần. Vì vậy, ông đã tạo ra một bảng đơn giản, mà ông tự nhiên đủ gọi là "DUAL".

Sau đó, anh ta cần làm điều gì đó chỉ có thể 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 ấy quên đồng hồ và muốn đọc thời gian qua CHỌN SYSDATE FROM ...) Anh nhận ra anh vẫn còn bảng DUAL của mình nằm xung quanh, và sử dụng nó. Sau một thời gian, anh mệt mỏi khi nhìn thấy thời gian in hai lần, vì vậy anh cuối cùng đã xóa một trong những hàng.

Những người khác tại Oracle bắt đầu sử dụng bảng của mình và cuối cùng nó đã được quyết định đưa nó vào bản cài đặt chuẩn của Oracle.

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

3

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

5

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

Ví dụ: giả sử bạn đang xây dựng một ứng dụng chênh lệch (giao dịch). Bạn có người bán cung cấp sản phẩm với giá và người mua yêu cầu sản phẩm với chi phí. Bạn tham gia chéo vào 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á, sau đó sắp xếp desc. về điều này để cung cấp cho bạn (người trung gian) các giao dịch sinh lợi nhất để thực hiện. Hầu như lúc nào bạn cũng sẽ có các tiêu chí lọc giới hạn khác.

2

Đây là một cách thú vị để sử dụng tham gia chéo tới create a crosstab report. Tôi tìm thấy nó trong Joe Celko's SQL For Smarties và đã sử dụng nó nhiều lần. Nó có một chút thiết lập, nhưng đã được giá trị thời gian đầu tư.

Các vấn đề liên quan