2010-03-04 23 views

Trả lời

12

chỉ là ví dụ ngẫu nhiên. bạn có một bảng thành phố: Id, Lat, Lon, Name. Bạn muốn hiển thị bảng người dùng khoảng cách từ thành phố này đến thành phố khác. Bạn sẽ viết một cái gì đó như

SELECT c1.Name, c2.Name, SQRT((c1.Lat - c2.Lat) * (c1.Lat - c2.Lat) + (c1.Lon - c2.Lon)*(c1.Lon - c2.Lon)) 
FROM City c1, c2 
+0

có ngoại trừ khoảng cách trên quả địa cầu không hoạt động như vậy, bạn cần một vòng tròn tuyệt vời để làm điều đó đúng cách –

+3

tôi đang chờ lời khen này :) tôi hoàn toàn đồng ý, nhưng ví dụ là nhiều hơn về sql – Andrey

1

Thông thường, để tạo ra một siêu cho báo cáo.

Trong PosgreSQL:

SELECT COALESCE(SUM(sales), 0) 
FROM generate_series(1, 12) month 
CROSS JOIN 
     department d 
LEFT JOIN 
     sales s 
ON  s.department = d.id 
     AND s.month = month 
GROUP BY 
     d.id, month 
3

Dưới đây là hai ví dụ:

Để tạo nhiều bản sao của hóa đơn hoặc tài liệu khác mà bạn có thể cư một bảng tạm thời với tên của các bản sao, sau đó Descartes tham gia bảng vào hồ sơ hóa đơn thực tế. Tập kết quả sẽ chứa một bản ghi cho mỗi bản sao của hóa đơn, bao gồm "tên" của bản sao để in trong một thanh ở đầu hoặc cuối trang hoặc dưới dạng hình mờ. Sử dụng kỹ thuật này, chương trình có thể cung cấp cho người dùng các hộp kiểm cho phép họ chọn những bản sao để in hoặc thậm chí cho phép họ in "bản sao đặc biệt" trong đó người dùng nhập tên bản sao.

CREATE TEMP TABLE tDocCopies (CopyName TEXT(20)) 
INSERT INTO tDocCopies (CopyName) VALUES ('Customer Copy') 
INSERT INTO tDocCopies (CopyName) VALUES ('Office Copy') 
... 
INSERT INTO tDocCopies (CopyName) VALUES ('File Copy') 
SELECT * FROM InvoiceInfo, tDocCopies WHERE InvoiceDate = TODAY() 

Để tạo ma trận lịch, với một bản ghi cho mỗi người mỗi ngày, chuyên gia tham gia bảng người đến bảng khác có chứa tất cả các ngày trong tuần, tháng hoặc năm.

SELECT People.PeopleID, People.Name, CalDates.CalDate 
    FROM People, CalDates 
0

Bạn có thể muốn tạo báo cáo bằng cách sử dụng tất cả các kết hợp có thể có từ hai bảng tra cứu, để tạo báo cáo có giá trị cho mọi kết quả có thể.

Xem xét theo dõi lỗi: bạn đã có một bảng cho mức độ nghiêm trọng và mức độ ưu tiên khác cho mức độ ưu tiên và bạn muốn hiển thị số lượng cho từng kết hợp. Bạn có thể kết thúc với một cái gì đó như thế này:

select severity_name, priority_name, count(*) 
from (select severity_id, severity_name, 
      priority_id, priority_name 
     from severity, priority) sp 
     left outer join 
     errors e 
     on e.severity_id = sp.severity_id 
     and e.priority_id = sp.priority_id 
group by severity_name, priority_name 

Trong trường hợp này, tham gia cartesian giữa mức độ nghiêm trọng và ưu tiên cung cấp danh sách chính mà bạn có thể tạo tham gia bên ngoài.

0

Đây là lần duy nhất trong cuộc đời tôi tìm thấy một cách sử dụng hợp pháp cho một sản phẩm Descartes.

Ở công ty cuối cùng tôi làm việc, có một báo cáo được yêu cầu hàng quý để xác định Câu hỏi thường gặp nào được sử dụng tại mỗi khu vực địa lý cho trang web quốc gia mà chúng tôi đã làm.

Cơ sở dữ liệu của chúng tôi mô tả các vùng địa lý (thị trường) theo một bộ tóan (4, x), trong đó 4 đại diện cho một số cấp trong một hệ thống phân cấp và x đại diện cho một số marketId duy nhất.

Mỗi Câu hỏi thường gặp được xác định bởi FaqId và mỗi liên kết đến Câu hỏi thường gặp được xác định bằng khóa tổng hợp marketId tuple và FaqId. Các hiệp hội được thiết lập thông qua một ứng dụng quản trị, nhưng cho rằng có 1000 câu hỏi thường gặp trong hệ thống và 120 thị trường, đó là một rắc rối để thiết lập các hiệp hội ban đầu bất cứ khi nào một câu hỏi thường gặp mới được tạo ra. Vì vậy, chúng tôi đã tạo một lựa chọn thị trường mặc định và đã vượt qua một số marketId tuple của (-1,-1) để đại diện cho điều này.

Quay lại báo cáo - báo cáo cần hiển thị mọi câu hỏi thường gặp/câu trả lời và các thị trường hiển thị Câu hỏi thường gặp này trong ma trận 2D (chúng tôi đã sử dụng bảng tính Excel). Tôi thấy rằng cách dễ nhất để liên kết từng Câu hỏi thường gặp với từng thị trường trong trường hợp lựa chọn thị trường mặc định là với truy vấn này, kết hợp kết quả đã phát nổ với tất cả các liên kết Câu hỏi thường gặp trực tiếp khác.

Bảng Faq2LevelDefault giữ tất cả các thị trường được xác định là đang được chọn mặc định (tôi tin đó chỉ là danh sách các marketIds).

SELECT FaqId, fld.LevelId, 1 [Exists] 
FROM Faq2Levels fl 
    CROSS JOIN Faq2LevelDefault fld 
WHERE fl.LevelId=-1 and fl.LevelNumber=-1 and fld.LevelNumber=4 
UNION 
SELECT Faqid, LevelId, 1 [Exists] from Faq2Levels WHERE LevelNumber=4 
0

Khi chạy truy vấn cho mỗi ngày trong một phạm vi nhất định. Ví dụ: đối với một trang web, bạn có thể muốn biết mỗi ngày, số lượng người dùng đã hoạt động trong N ngày qua. Bạn có thể chạy một truy vấn cho mỗi ngày trong một vòng lặp, nhưng nó đơn giản nhất để giữ tất cả các logic trong cùng một truy vấn, và trong một số trường hợp, DB có thể tối ưu hóa việc tham gia Descartes.

1

Tôi đã nhận thấy việc này được thực hiện để cố gắng cố tình làm chậm hệ thống hoặc để thực hiện kiểm tra căng thẳng hoặc lý do cho việc phân phối phát triển bị thiếu.

0

Để tạo danh sách các từ có liên quan trong khai thác văn bản, sử dụng các hàm tương tự, ví dụ: Chỉnh sửa khoảng cách

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