Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alternative zu Intersect in MySQL

INTERSECT von Microsoft SQL Server "gibt alle unterschiedlichen Werte zurück, die sowohl von der Abfrage auf der linken als auch auf der rechten Seite des INTERSECT-Operanden zurückgegeben werden" Dies unterscheidet sich von einem standardmäßigen INNER JOIN oder WHERE EXISTS Abfrage.

SQL-Server

CREATE TABLE table_a (
    id INT PRIMARY KEY,
    value VARCHAR(255)
);

CREATE TABLE table_b (
    id INT PRIMARY KEY,
    value VARCHAR(255)
);

INSERT INTO table_a VALUES (1, 'A'), (2, 'B'), (3, 'B');
INSERT INTO table_b VALUES (1, 'B');

SELECT value FROM table_a
INTERSECT
SELECT value FROM table_b

value
-----
B

(1 rows affected)

MySQL

CREATE TABLE `table_a` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `value` varchar(255),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `table_b` LIKE `table_a`;

INSERT INTO table_a VALUES (1, 'A'), (2, 'B'), (3, 'B');
INSERT INTO table_b VALUES (1, 'B');

SELECT value FROM table_a
INNER JOIN table_b
USING (value);

+-------+
| value |
+-------+
| B     |
| B     |
+-------+
2 rows in set (0.00 sec)

SELECT value FROM table_a
WHERE (value) IN
(SELECT value FROM table_b);

+-------+
| value |
+-------+
| B     |
| B     |
+-------+

Bei dieser speziellen Frage ist die ID-Spalte involviert, daher werden keine doppelten Werte zurückgegeben, aber der Vollständigkeit halber hier eine MySQL-Alternative mit INNER JOIN und DISTINCT :

SELECT DISTINCT value FROM table_a
INNER JOIN table_b
USING (value);

+-------+
| value |
+-------+
| B     |
+-------+

Und ein weiteres Beispiel mit WHERE ... IN und DISTINCT :

SELECT DISTINCT value FROM table_a
WHERE (value) IN
(SELECT value FROM table_b);

+-------+
| value |
+-------+
| B     |
+-------+