Альтернатива для пересечения в MySQL

Я должен реализовать следующий запрос в MySQL.

(select * from emovis_reporting where (id=3 and cut_name= '全プロセス' and cut_name='恐慌') ) 
intersect
( select * from emovis_reporting where (id=3) and ( cut_name='全プロセス' or cut_name='恐慌') )

Я знаю, что пересекаются, не находится в MySQL. Таким образом, мне нужно иначе. Ведите меня.

60
задан beporter 4 August 2016 в 20:54
поделиться

3 ответа

Ваш запрос всегда будет возвращать пустой набор записей, поскольку cut_name = '全 プ ロ セ ス' и cut_name = '恐慌' никогда не будет оцениваться как верно .

В общем, INTERSECT в MySQL следует эмулировать следующим образом:

SELECT  *
FROM    mytable m
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    othertable o
        WHERE   (o.col1 = m.col1 OR (m.col1 IS NULL AND o.col1 IS NULL))
                AND (o.col2 = m.col2 OR (m.col2 IS NULL AND o.col2 IS NULL))
                AND (o.col3 = m.col3 OR (m.col3 IS NULL AND o.col3 IS NULL))
        )

Если в обеих ваших таблицах есть столбцы, помеченные как NOT NULL , вы можете опустить части IS NULL и перепишите запрос с немного более эффективным IN :

SELECT  *
FROM    mytable m
WHERE   (col1, col2, col3) IN
        (
        SELECT  col1, col2, col3
        FROM    othertable o
        )
15
ответ дан 24 November 2019 в 17:47
поделиться

AFAIR, MySQL реализует INTERSECT через INNER JOIN.

-2
ответ дан 24 November 2019 в 17:47
поделиться

Microsoft SQL Server INTERSECT "возвращает любые отдельные значения, которые возвращаются запросом с левой и правой стороны операнда INTERSECT" Это отличается от стандартного INNER JOIN или WHERE EXISTS запроса.

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

В данном конкретном вопросе задействован столбец id, поэтому дубликаты значений не будут возвращены, но для полноты картины вот альтернатива MySQL с использованием INNER JOIN и DISTINCT:

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

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

И еще один пример с использованием WHERE ... IN and DISTINCT:

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

+-------+
| value |
+-------+
| B     |
+-------+
55
ответ дан 24 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: