任何人都可以建议MYSQL的"交叉"和"减号"的替代?

Ash*_*wal -1 mysql mysql-error-1064

MYSQL(version5.1)中以下查询的GOT错误

SELECT year,month,sum(fact_1),sum(fact_2),sum(fact_3),sum(fact_4)
from(
select year,month,fact_1,fact_2,0 as fact_3,0 as fact_4 from table_1
intersect
select year,month,0 as fact_1,0 as fact_2,fact_3,fact_4 from table_2
) as combined_table
group by month,year
Run Code Online (Sandbox Code Playgroud)

代码为#1064的错误行: -

您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册,以便在'select year,month,0 as fact_1,0 as fact_2,fact_3,fact_4 from table_2'附近使用正确的语法,作为第5行的ct g'

但是以下查询给出了期望的结果: -

SELECT year,month,sum(fact_1),sum(fact_2),sum(fact_3),sum(fact_4)
from(
select year,month,fact_1 ,fact_2,0 as fact_3,0 as fact_4 from table_1
union
select year,month,0 as fact_1,0 as fact_2,fact_3,fact_4 from table_2
) as ct
group by month,year
Run Code Online (Sandbox Code Playgroud)

任何人都能说出我犯的错误吗?任何人都可以帮助我理解问题背后的根本原因.

kni*_*ttl 5

你可以INTERSECT使用INNER(self)很容易伪造JOIN,这样你只能从两个结果集中获取行:

    SELECT `a`.`id`, `a`.`name`
      FROM `a`
INNER JOIN `b`
     USING (`id`, `name`)
Run Code Online (Sandbox Code Playgroud)

MINUS可以假装LEFT JOIN:

    SELECT DISTINCT `a`.`id`, `a`.`name`
      FROM `a`
 LEFT JOIN `b`
     USING (`id`, `name`)
     WHERE `b`.`id` IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 为什么你有一个工作的解决方案?替代解决方案将使用"NOT IN"或"NOT EXISTS" (3认同)