Sự khác biệt giữa NHÓM B, A và NHÓM THEO HỢP ĐỒNG (B, A)


20

Tôi đã nhận được chính mình rất bối rối.

Ai đó có thể vui lòng giải thích trong những trường hợp nào tôi muốn sử dụng NHÓM THEO HỢP ĐỒNG?

Tôi đoán là tôi sẽ sử dụng nó nếu tôi muốn nhóm một cách có điều kiện một tập hợp dữ liệu theo cột B (nếu B không null) và theo cột A nếu không. Nghe có đúng không?

Câu trả lời:


37

Với GROUP BY b,acác bộ dữ liệu (null, 1), (1,1), (2,1)(17,1)sẽ kết thúc trong bốn nhóm khác nhau.

Với GROUP BY coalesce(b,a)các bộ dữ liệu (null,1), (1,1), (2,1)(17,1)sẽ kết thúc trong cùng một nhóm.

Nếu bạn muốn nhóm "có điều kiện", thì có, phiên bản với coalescecó lẽ là những gì bạn muốn.


Chris Date : "Một 'loại' chứa null không phải là một loại (vì các loại chứa các giá trị). Một 'tuple' chứa null không phải là một tuple (vì các bộ chứa các giá trị)."
onedaywhen

@encedaywhen: tốt, đó là sự khác biệt giữa lý thuyết và thực hành;)
a_horse_with_no_name

Quan điểm của tôi: đó là sự khác biệt giữa một tuple trong một mối quan hệ và một hàng trong biểu thức bảng SQL. Một tuple không áp dụng cho SQL, cả về lý thuyết và thực tế.
onedaywhen

@encedaywhen: vậy ý ​​bạn là tôi nên thay đổi từ ngữ của mình? Từ nào bạn muốn giới thiệu để kết hợp hai giá trị (cột) trong SQL sau đó? Họ không nhất thiết phải ở cùng một bảng hoặc không phải là một hàng hoàn chỉnh.
a_horse_with_no_name

1
Ví dụ, trong Hướng dẫn D, TUPLE { a 17 , b 1 }giống như TUPLE { b 1 , a 17 }, nhưng trong SQL, hàm tạo giá trị hàng (17, 1)không giống với hàm tạo giá trị hàng (1, 17). Đây là lý do tại sao "cặp" của bạn không phải là bộ dữ liệu. Bởi vì bạn đã bỏ qua một hàm tạo kiểu hàng, tôi phải giả sử từ ngữ cảnh (a, b)thay vì (b, a)nhưng sự bao gồm của nó vẫn không làm cho nó trở thành một tuple. Ngược lại, TUPLE { 17 , 1 }không phải là một lời gọi tuple hợp lệ trong Hướng dẫn D, cũng không TUPLE { a null , b 1 }.
onedaywhen

16

Dưới đây là một minh chứng về câu trả lời +1 tuyệt vời của a_horse_with_no_name .

SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT A, B, count(*) FROM Data GROUP BY B, A;

A B   COUNT(*)
- - ----------
1 1          2
1            1
1 2          1
  1          1


SQL> WITH Data AS (
  2     SELECT level, DECODE(Level,3,NULL,1) A
  3        , DECODE(level,2,NULL,4,2,1) B
  4     FROM dual connect by level <=5
  5     )
  6  SELECT COALESCE(B, A) X, count(*) FROM Data GROUP BY COALESCE(B, A);

X   COUNT(*)
- ----------
1          4
2          1

2
Trình diễn tốt đẹp!
a_horse_with_no_name

Tôi phải có phản xạ để suy nghĩ về 'cấp độ', nó rất hữu ích!
Lục M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.