猿问

MySQL中相交的替代方法

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里。所以我需要另一种方法。请引导我。


慕尼黑8549860
浏览 653回答 3
3回答

慕姐4208626

Microsoft SQL Server的INTERSECT “返回由IntersectOperand左侧和右侧的查询返回的任何不同值”这与标准不同INNER JOIN或WHERE EXISTS查询。SQLServerCREATE 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_aINTERSECTSELECT value FROM table_bvalue-----B(1 rows affected)MySQLCREATE 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_aINNER JOIN table_bUSING (value);+-------+| value |+-------+| B     || B     |+-------+2 rows in set (0.00 sec)SELECT value FROM table_aWHERE (value) IN(SELECT value FROM table_b);+-------+| value |+-------+| B     || B     |+-------+对于这个特定的问题,涉及id列,所以不会返回重复的值,但是为了完整起见,这里有一个MySQL替代方法INNER JOIN和DISTINCT:SELECT DISTINCT value FROM table_aINNER JOIN table_bUSING (value);+-------+| value |+-------+| B     |+-------+另一个例子是WHERE ... IN和DISTINCT:SELECT DISTINCT value FROM table_aWHERE (value) IN(SELECT value FROM table_b);+-------+| value |+-------+| B     |+-------+

萧十郎

通过使用UNIONALL和GROUPBY,有一种更有效的生成互联系统的方法。根据我在大型数据集上的测试,性能要好两倍。例子:SELECT t1.value from (   (SELECT DISTINCT value FROM table_a)   UNION ALL    (SELECT DISTINCT value FROM table_b)) AS t1 GROUP BY value HAVING count(*) >= 2;它更有效,因为使用内部联接解决方案,MySQL将查找第一个查询的结果,然后对每一行查找第二个查询中的结果。使用UNIONALGROUPBY解决方案,它将查询第一个查询的结果,第二个查询的结果,然后将所有结果一次组合在一起。

浮云间

查询将始终返回空记录集,因为cut_name= '全プロセス' and cut_name='恐慌'永远不会评估true.总体而言,INTERSECT在……里面MySQL应该这样模仿:SELECT  *FROM    mytable mWHERE   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 mWHERE   (col1, col2, col3) IN         (         SELECT  col1, col2, col3        FROM    othertable o        )
随时随地看视频慕课网APP

相关分类

MySQL
我要回答