Patrocínio Natura

UNION, EXCEPT, e INTERSECT no MySql

23 de novembro de 2010

Precisei usar os comandos UNION, EXCEPT, e INTERSECT no MySql, para minha grande surpresa o MySql não da suporte para esses comandos, exceto o Union. E como fazer para ter o resultado esperado sem precisar recorrer a “manobras” fora do MySql? A solução que encontrei foi usando subquery. Seguem abaixo pequenos modelos:

Primeiro um modelo simples apenas entre duas tabelas

EXCEPT

SELECT
  `tabela1`.`cod_barra` as campo1, `tabela2`.`cod_barra` as campo1 FROM
  `tabela1` LEFT JOIN
  `tabela2` ON `tabela2`.`cod_barra` = `tabela1`.`cod_barra`
WHERE `tabela2`.`cod_barra` IS NULL;

INTERSECT

SELECT
  `tabela1`.`cod_barra` as campo1, `tabela2`.`cod_barra` as campo1 FROM
  `tabela1` LEFT JOIN
  `tabela2` ON `tabela2`.`cod_barra` = `tabela1`.`cod_barra`
WHERE `tabela2`.`cod_barra` IS NULL;

Agora uma segunda forma de fazer a mesma coisa entre resultados de consultas ao invés de apenas tabelas.

EXCEPT

SELECT
  `query1`.`codigo`
FROM
  (SELECT `tabela2`.`codigo`
    FROM `tabela2` INNER JOIN
      `tabela1` ON `tabela1`.`codigo` = `tabela2`.`codigo`
    WHERE `tabela1`.`campo` = x) AS `query2`
  RIGHT JOIN
  (SELECT `tabela1`.`codigo`
    FROM `tabela1`
    WHERE `tabela1`.`campo` = x) AS `query1` ON `query2`.`cododigo` =
    `query1`.`codigo`
WHERE
  `query2`.`codigo` IS NULL;

INTERSECT

SELECT
  `query1`.`codigo`
FROM
  (SELECT `tabela2`.`codigo`
    FROM `tabela2` INNER JOIN
      `tabela1` ON `tabela1`.`codigo` = `tabela2`.`codigo`
    WHERE `tabela1`.`campo` = x) AS `query2`
  RIGHT JOIN
  (SELECT `tabela1`.`codigo`
    FROM `tabela1`
    WHERE `tabela1`.`campo` = x) AS `query1` ON `query2`.`cododigo` =
    `query1`.`codigo`
WHERE
  `query2`.`codigo` <> ''

Hermínio Prieto – Programador carioca, residente no Rio de Janeiro. Cursa Ciência da Computação.

Compatilhe esse artigo!

7 Comentários

  • Ronkaly Souza 3 de setembro de 2014em15:51

    Muitíssimo obrigado cara! Me ajudou muito!

  • Plinio Cruz 13 de setembro de 2014em21:43

    Que bom! Volte sempre que precisar. abraço.

  • Alexandre Ferreira 12 de março de 2016em7:20

    Muitíssimo obrigado cara! Me ajudou muito!

  • Alexandre 12 de março de 2016em4:20

    Muitíssimo obrigado cara! Me ajudou muito!

  • Alexandre Ferreira 12 de março de 2016em7:25

    Heyy a query do EXCEPT está igual a do INTERSECT

  • Alexandre Ferreira 12 de março de 2016em7:29

    Galera, segue todo o DDL e DML ajustados:

    create table t1 (a int);
    create table t2 (b int);

    insert into t1 (a) values (1);
    insert into t1 (a) values (2);
    insert into t1 (a) values (3);
    insert into t1 (a) values (4);
    insert into t1 (a) values (5);
    select * from t1;

    insert into t2 (b) values (2);
    insert into t2 (b) values (3);
    insert into t2 (b) values (6);
    insert into t2 (b) values (7);
    select * from t2;

    — UNION
    select * from t1 — o primeiro select define o nome da coluna
    union all
    select * from t2;

    — INTERSECT
    SELECT
    *
    FROM
    t1
    LEFT JOIN
    t2 ON a = b
    WHERE
    b IS NOT NULL;

    — EXCEPT
    SELECT
    *
    FROM
    T1
    LEFT JOIN
    T2 ON A = B
    WHERE
    b IS NULL;

  • Plinio Cruz 12 de março de 2016em13:24

    Obrigado pela colaboração Alexandre! Essa é a motivação de manter o site do Clube da Informática, a ajuda entre os visitantes. Abraço.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

This site uses Akismet to reduce spam. Learn how your comment data is processed.