Nhận các hàng có các giá trị khác nhau cho một cột dựa trên các giá trị trùng lặp của 3 cột khác


10

Tôi muốn chỉ nhận các hàng có giá trị khác nhau trong một cột (tên cột DEF) dựa trên các hàng trùng lặp có sự kết hợp duy nhất của 3 cột khác.

Ví dụ: Trong ví dụ dưới đây, hai hàng đầu tiên có cùng giá trị cho 3 cột đầu tiên. Nhưng chúng có giá trị khác nhau cho cột DEF. Vì vậy, cả hai hàng này sẽ được liệt kê trong đầu ra.

Nhưng hàng 2 và 4 có sự kết hợp duy nhất cho 3 cột đầu tiên nhưng chúng có cùng giá trị trong cột DEF. Không được liệt kê trong đầu ra.

hàng 5 và 6 không được liệt kê vì chúng là hàng đơn với các giá trị khác nhau.

+----------+-------+--------+--------+
| dept     | role1 |role2   |DEF     |
+----------+-------+--------+--------+
| a        | abc   | er     | 0      |
| a        | abc   | er     | 1      |
| b        | qwer  | ty     | 0      |
| b        | qwer  | ty     | 0      |
| c        | der   | ui     | 1      |
| d        | nerr  | io     | 0      |
+----------+-------+--------+--------+
output

+----------+------+------+------+
| dept     | role1|role2 |DEF   |
+----------+------+------+------+
| a        | abc  | er   |0     |
| a        | abc  | er   |1     |
+----------+------+------+------+

Tôi đã thử sử dụng khác biệt với việc có nhưng không thể kiểm tra các giá trị của cột DEF để có kết quả mong muốn.

có ai có thể giúp tôi trong việc này không?

Câu trả lời:


14

Sử dụng SQL tiêu chuẩn trên hầu hết RDBMS, có nhiều cách khác nhau.

Sử dụng truy vấn con:

SELECT d.dept, d.role1, d.role2, DEF
FROM data d
INNER JOIN (
    SELECT dept, role1, role2 
    FROM data
    GROUP BY dept, role1, role2
    HAVING COUNT(distinct DEF) > 1
) dup
    ON dup.dept = d.dept AND dup.role1 = d.role1 AND dup.role2 = d.role2
;

Truy vấn con trả về các tập hợp dept/role1/role2có nhiều hơn 1 khác biệt DEF.

Sử dụng truy vấn con tương quan:

SELECT d.dept, d.role1, d.role2, DEF
FROM @data d
WHERE EXISTS (
    SELECT 1 
    FROM @data 
    WHERE dept = d.dept AND role1 = d.role1 AND role2 = d.role2 AND DEF <> d.DEF
);

Truy vấn con trả về 0 cho n hàng. Nếu có ít nhất một hàng tồn tại, hàng từ bảng chính được trả về.

Sử dụng CROSS APPLY:

SELECT d.dept, d.role1, d.role2, d.DEF
FROM @data d
CROSS APPLY (
    SELECT n=1 
    FROM @data 
    WHERE dept = d.dept AND role1 = d.role1 AND role2 = d.role2 AND DEF <> d.DEF
) ca
;

CROSS ỨNG DỤNG hoạt động với Oracle hoặc SQL Server.

Đầu ra:

dept    role1   role2   DEF
a       abc     er      0
a       abc     er      1
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.