Bạn muốn thực hiện phân chia quan hệ, một thao tác không được triển khai trong SQL. Dưới đây là một ví dụ trong đó chúng ta có một sản phẩm cung cấp bảng và một bắt buộc về sản phẩm bảng:
CREATE TABLE product_supplier (
product_id int NOT NULL,
supplier_id int NOT NULL,
UNIQUE (product_id, supplier_id)
);
INSERT INTO product_supplier (product_id, supplier_id) VALUES
(1, 1),
(2, 1),
(3, 1),
(1, 2),
(2, 2),
(3, 2),
(4, 2),
(2, 3),
(3, 3),
(4, 3);
CREATE TABLE reqd (
product_id int NOT NULL,
UNIQUE (product_id)
);
INSERT INTO reqd (product_id) VALUES
(1),
(2),
(3);
... và chúng tôi muốn tìm tất cả các nhà cung cấp mà cung cấp tất cả các sản phẩm theo yêu cầu và có lẽ những người khác. Kết quả trong ví dụ trên sẽ là nhà cung cấp 1 và 2.
Giải pháp thẳng nhất về phía trước là thế này:
SELECT product_supplier.supplier_id
FROM product_supplier
LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
GROUP BY product_supplier.supplier_id
HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd);
+-------------+
| supplier_id |
+-------------+
| 1 |
| 2 |
+-------------+
Và nếu chúng ta muốn tìm tất cả các nhà cung cấp mà cung cấp tất cả các sản phẩm cần thiết và không có những người khác (chính xác bộ phận/no còn lại) sau đó thêm một điều kiện nữa các phần trên:
SELECT product_supplier.supplier_id
FROM product_supplier
LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
GROUP BY product_supplier.supplier_id
HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd)
AND COUNT(product_supplier.product_id) = (SELECT COUNT(*) FROM reqd);
+-------------+
| supplier_id |
+-------------+
| 1 |
+-------------+
Một giải pháp thay thế là để diễn đạt lại vấn đề: chọn s uppliers nơi sản phẩm được yêu cầu không tồn tại mà không tồn tại trong các sản phẩm do nhà cung cấp cung cấp. Hmmm:
SELECT DISTINCT supplier_id
FROM product_supplier AS ps1
WHERE NOT EXISTS (
SELECT *
FROM reqd
WHERE NOT EXISTS (
SELECT *
FROM product_supplier AS ps2
WHERE ps1.supplier_id = ps2.supplier_id AND ps2.product_id = reqd.product_id
)
);
+-------------+
| supplier_id |
+-------------+
| 1 |
| 2 |
+-------------+
nhờ nhưng sản lượng tôi có được lặp lại tôi nghĩ rằng vì để tạo ra chiếc xe bảng tôi được sử dụng bên trong tham gia – user1229351
Tuy nhiên, điều này sẽ không làm việc với ký tự đại diện, vì trong trường hợp này, rõ ràng không thể đếm được thành lập. –