suchen

Heim  >  Fragen und Antworten  >  Hauptteil

mysql – SQL identifiziert unterschiedliche Daten in zwei Tabellen

Es gibt zwei Tabellen mit etwa 10.000 Zeilen. Wir müssen die Zeilen mit Unterschieden abfragen. Der aktuelle Code lautet wie folgt:

SELECT number, version
FROM
 (
   SELECT a.number, b.version
   FROM a
   UNION ALL
   SELECT b.number, b.version
   FROM b
)  tb
GROUP BY number, version
HAVING COUNT(*) = 1
ORDER BY number

Aber hier kommt das Problem. Der obige Code kann nur verschiedene Zeilen abfragen, aber er kann nicht diejenigen in Tabelle a anzeigen, die nicht in Tabelle b sind, und diejenigen in Tabelle b, die nicht in Tabelle a sind Zeilen in der dritten Spalte anzeigen?

曾经蜡笔没有小新曾经蜡笔没有小新2809 Tage vor756

Antworte allen(2)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-05-18 10:51:15

    按楼主意思,单表中number和version是不会重复的,两张表的number和version建一个复合索引,然后执行以下sql

    SELECT a.number, a.version,'from_a'
    FROM a
    where not exists (
    SELECT 1 FROM b where a.number=b.number and a.version=b.version)
    union all
    SELECT b.number, b.version,'from_b'
    FROM b
    where not exists (
    SELECT 1 FROM a where a.number=b.number and a.version=b.version)
    ORDER BY number;
    或者
    SELECT a.number, a.version,'from_a'
    from a left join b on a.number=b.number and a.version=b.version
    where b.id is null
    union all
    SELECT b.number, b.version,'from_b'
    from a right join b on a.number=b.number and a.version=b.version
    where a.id is null
    ORDER BY number;
    下面这个效率可能会差点

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-18 10:51:15

    试试full join ... where a is null or b is null。比如用Postgres:

    select
      case when a.n is null then b.n else a.n end as n,
      case when a.n is null then b.v else a.v end as v,
      case when a.n is null then 'b' else 'a' end as src
    from
      (values(1, 2), (2, 3), (3, 4)) as a(n, v)
      full join
      (values(6, 7), (2, 3), (3, 9)) as b(n, v)
      using (n, v)
    where a.n is null or b.n is null

    结果:

     n | v | src
    ---+---+-----
     1 | 2 | a
     3 | 4 | a
     3 | 9 | b
     6 | 7 | b
    (4 行记录)
    

    Antwort
    0
  • StornierenAntwort