2009-07-28 41 views
7

Gần đây tôi đã xem qua bài kiểm tra sau đây. Hãy tưởng tượng chúng tôi có bảng nàyBài kiểm tra SQL thú vị

+--------+ 
| colors | 
+--------+ 
| red | 
| black | 
| white | 
| green | 
| orange | 
+--------+ 

Nhiệm vụ là viết một truy vấn SQL sẽ chọn tất cả các cặp mà không cho phép trùng lặp. Các phép tính cũng được tính ({red, black} = {black, red}, do đó chỉ cho phép một trong hai cặp).

+0

Bạn đang tìm kiếm ANSI SQL hoặc nó có thể được DBMS cụ thể (ví dụ SQL Server.)? –

+0

không, chỉ cần đơn giản ANSI – glaz666

Trả lời

27

Hãy thử điều này

Select A.Color, B.Color 
From Colors A 
Cross Join Colors B 
Where A.Color > B.Color 
+0

Đen = Đen sẽ là sai, do đó nó sẽ được chọn. Truy vấn trên có vẻ tốt với tôi –

+0

Đây là một liên kết thú vị trên CROSS JOINS http://www.databasejournal.com/sqletc/article.php/1438121/Generate-Test-Data-Quickly-with-Cross-Joins. htm –

+0

@glaz, bởi vì phép nối chéo có nghĩa là lấy mọi phần tử trong Set A và ghép nối nó với mọi phần tử trong Set B ... Vì vậy, bạn nhận được mọi kết hợp có thứ tự có thể. Định vị mệnh đề where chỉ loại bỏ các vị trí mà các cặp phần tử từ cùng một phần tử, và một trong các phần tử trùng lặp ... (A, B) và (B, A) –

0
Select A.Colors, B.Colors From Colors A 
Cross Join Colors B Where A.Colors < B.Colors or B.colors < A.colors 
+3

Điều này sẽ vi phạm điều kiện trước về hoán vị: '{ đỏ, đen} = {đen, đỏ}, do đó chỉ có một cặp được phép'. –

0

thử điều này:

Select * From colours A 
Cross Join colours B Where A.colours < B.colours or B.colours > A.colours 
and b.colours != b.colours and a.colours != a.colours 
Các vấn đề liên quan