2013-03-25 28 views

Trả lời

16

Sử dụng HAVING:

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices 
    ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000 

Vấn đề là mệnh đề WHEREthực hiện trước khi tuyên bố SELECT. Do đó, cột sumTotal chưa có sẵn.

Điều khoản HAVINGđược thực hiện sau tuyên bố SELECT. Nó loại lọc kết quả ra sau khi bạn đã chọn tất cả mọi thứ. Mặc dù vậy, hãy nhớ rằng vì việc sử dụng HAVING sẽ chậm hơn. Nó hoạt động trên toàn bộ các hàng.

Từ MySQL documentation:

Mệnh đề HAVING được áp dụng gần cuối cùng, ngay trước mặt hàng được gửi cho khách hàng, không có tối ưu hóa. (LIMIT được áp dụng sau khi HAVING.)

Tiêu chuẩn SQL yêu cầu HAVING phải chỉ tham chiếu các cột trong mệnh đề GROUP BY hoặc cột được sử dụng trong hàm tổng hợp. Tuy nhiên, MySQL hỗ trợ phần mở rộng cho hành vi này và cho phép HAVING tham chiếu đến các cột trong danh sách SELECT và các cột trong các truy vấn phụ bên ngoài.


Mệnh đề HAVING có thể tham khảo chức năng tổng hợp, trong đó mệnh đề WHERE không thể:

SELECT user, MAX(salary) 
FROM users 
GROUP BY user 
HAVING MAX(salary) > 10; 

Không sử dụng HAVING cho các hạng mục mà phải ở trong mệnh đề WHERE .

+0

Một lĩnh vực tính toán tên dường như không làm việc (trong MS-SQL) với một trong hai CÓ hoặc ĐÂU http://sqlfiddle.com/#!6/92119/1 ... nhưng việc thêm phép tính một lần nữa trong mệnh đề WHERE dường như hoạt động! (http://sqlfiddle.com/#!6/92119/3) –

+0

@MrFuzzyButton MySQL và MS-SQL hoạt động theo cách khác. Câu trả lời của tôi và câu hỏi là hoàn toàn về MySQL như tôi đã chỉ ra ở trên. –

+1

Có, nhưng tôi nghĩ rằng nó đáng chú ý, tuy nhiên :) –

4

Bạn cũng có thể thử điều này:

WITH temp AS 
(
SELECT 
    dept.id, 
    (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept INNER JOIN invoices ON invoices.id_dept = dept.id 
) 
SELECT * 
FROM temp 
WHERE sumTotal > 10000 
+1

Cảm ơn bạn đã chỉnh sửa câu lệnh. Tôi mới vào stackoverflow và cần phải học cách sử dụng tất cả các công cụ. – user1994514

1

Bạn phải sử dụng 'có' -

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
FROM dept 
INNER JOIN invoices ON invoices.id_dept = dept.id 
HAVING sumTotal > 10000 

Tôi không chắc chắn cho dù bạn có thể sử dụng lĩnh vực aliased của bạn hoặc cho dù bạn có để viết 'có (invoice.col1 + invoice.col2 + invoice.col3)> 10000.

Câu lệnh' where 'hoạt động cùng với' select ': nó lọc hồ sơ ban đầu được trả về. 'Có' sau đó các bộ lọc trả về tập dữ liệu, thông thường vì điều kiện 'có' không thể được biết tại thời điểm 'chọn'.

Để trích dẫn một tài liệu, 'Mệnh đề HAVING đã được thêm vào SQL vì không thể sử dụng từ khóa WHERE với hàm tổng hợp'. Một nơi khác được viết 'Mệnh đề SQL HAVING được sử dụng kết hợp với mệnh đề SQL GROUP BY.Nó có thể được sử dụng trong câu lệnh SQL SELECT để lọc các bản ghi mà một SQL GROUP BY trả về. '

+0

Không ai trong số đó áp dụng ở đây. – Strawberry

5

Hoặc sử dụng WHERE ...

SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal 
    FROM dept 
    JOIN invoices ON invoices.id_dept = dept.id 
WHERE invoices.col1 + invoices.col2 + invoices.col3 > 10000 
Các vấn đề liên quan