2015-05-19 22 views
5

Bài đăng sau đây có lý do thuyết phục để tránh sử dụng select * trong SQL.Thực hành tốt nhất: Chọn * trên CTE

Why is SELECT * considered harmful?

Trong các cuộc thảo luận là ví dụ về khi nó được hoặc là không thể chấp nhận được để sử dụng select * Tuy nhiên tôi không có vẻ thảo luận về biểu thức bảng chung (CTE). Có bất kỳ hạn chế nào khi sử dụng select * trong CTE không?

Ví dụ:

WITH CTE1 AS 
(
    SELECT Doc, TotalDue 
    FROM ARInvoices 
    WHERE CustomerName = 'ABC' 
    UNION 
    SELECT Doc, - TotalDue 
    FROM ARInvoiceMemos 
    WHERE CustomerName = 'ABC' 
) 

select * from CTE1 
UNION 
Select 'Total' as Doc, sum(TotalDue) 
FROM CTE1 
+0

Tôi tin rằng trường hợp tương tự áp dụng cho các CTE cho cùng một lý do được nêu trong câu hỏi mà bạn đã liên kết. Tôi không thể tìm thấy bất kỳ tài liệu nào để chứng minh điều này. –

+4

Không có hạn chế ở đây. Điều tương tự cũng áp dụng cho các bảng có nguồn gốc 'select * từ (chọn a, b, c từ some_table) như t' –

Trả lời

2

Vì bạn đã liệt kê đúng các tên cột trong cte, tôi không thấy bất kỳ tác hại trong việc sử dụng select * từ cte.
Trong thực tế, nó có thể chỉ là nơi thích hợp để sử dụng select *, vì không có điểm liệt kê các cột hai lần.
Trừ khi bạn không cần phải sử dụng tất cả các cột được trả về bởi cte. (tức là một cột trong số cte được sử dụng trên truy vấn, nhưng không phải trong mệnh đề select) Trong trường hợp đó, tôi sẽ đề nghị chỉ liệt kê các cột bạn cần ngay cả khi từ chỉ đến một cte.

Lưu ý rằng nếu tự động cte sử dụng select * thì tất cả các mặt hạn chế được liệt kê trong bài đăng bạn đã liên kết áp dụng cho nó.

Phản đối chính của tôi đối với select * là sự cố thường được các nhà phát triển lười biếng sử dụng không xem xét hậu quả của *.

Lưu ý: Mọi thứ tôi đã viết ở đây cũng áp dụng cho các bảng có nguồn gốc.

2

Theo lý thuyết, quy tắc của ngón tay cái mà select * bị bệnh luôn được áp dụng. Tuy nhiên, trong thực tế, nếu bạn là nhà phát triển coi những thứ như thiết kế và thực hành lập trình tốt nói chung quan trọng như chức năng, CTE của bạn sẽ được mã hóa để chỉ trả về các cột thực sự cần thiết, vì vậy select * from CTE1 có thể không thật tệ

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