sql >> Database teknologi >  >> RDS >> Mysql

Alternativ til Intersect i MySQL

Microsoft SQL Servers INTERSECT "returnerer alle distinkte værdier, der returneres af både forespørgslen på venstre og højre side af INTERSECT-operanden" Dette er forskelligt fra en standard INNER JOIN eller WHERE EXISTS forespørgsel.

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     |
+-------+

Med dette særlige spørgsmål er id-kolonnen involveret, så duplikerede værdier vil ikke blive returneret, men for fuldstændighedens skyld er her et MySQL-alternativ ved hjælp af INNER JOIN og DISTINCT :

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

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

Og endnu et eksempel med WHERE ... IN og DISTINCT :

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

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


  1. Tips til migrering fra MySQL-replikering til MySQL Galera Cluster 4.0

  2. Fuldtekstsøgning siden PostgreSQL 8.3

  3. Returner parametrene for en lagret procedure eller brugerdefineret funktion i SQL Server (T-SQL-eksempler)

  4. Hvordan holder data ikke sorteret?