0

如何在 MySQL (5.5) 中在两个 SQL 查询之间执行 MINUS。我不擅长 SQL。

我想要的是只获取第二个查询中不存在的键。我正在尝试使用 LEFT JOIN来完成此操作。我可以使用这样的东西:

     SELECT  target.component_id, target.asset_code FROM 
         (SELECT comp_files.* FROM stageSchema.components comp
             INNER JOIN productionSchema.component_files comp_files
             ON comp.id = comp_files.component_id) target
     LEFT JOIN 
         (SELECT comp_files.* FROM stageSchema.components comp
             INNER JOIN stageSchema.component_files comp_files
             ON comp.id = comp_files.component_id) stage
     ON target.component_id = stage.component_id
     WHERE stage.component_id IS NULL;

我知道上面的查询不正确。任何想法如何做到这一点?

component_files ”表的结构是:

    CREATE TABLE `component_files` (
     `component_id` int(11) NOT NULL,
     `asset_code` varchar(3) NOT NULL,
     `file_name` varchar(40) NOT NULL,
     `file_size` int(11) NOT NULL,
     `video_size` varchar(10) DEFAULT NULL,
     `bit_rate` varchar(10) NOT NULL,
     `last_updated_date` datetime NOT NULL,
     UNIQUE KEY `cf_uk` (`component_id`,`asset_code`) USING BTREE,
     CONSTRAINT `cf_comp_fk` FOREIGN KEY (`component_id`) REFERENCES `components` (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是 EXPLAIN 的结果

没有 WHERE 子句: 在此处输入图像描述

使用 WHERE 子句: 在此处输入图像描述

4

1 回答 1

0

您的查询看起来正确。效率低下的原因可能是您没有提供其设计的 2 个表中缺少索引,以及 MySQL 优化器由于派生表而没有产生有效的计划。

尝试编写没有派生表的查询,仅使用连接:

 SELECT 
     target.component_id, target.asset_code 
 FROM 
     stageSchema.components comp
   INNER JOIN 
     productionSchema.component_files target
       ON comp.id = target.component_id
   LEFT JOIN 
     stageSchema.component_files stage
       ON comp.id = stage.component_id
 WHERE 
     stage.component_id IS NULL;
于 2013-07-06T14:09:00.903 回答