cari

Rumah  >  Soal Jawab  >  teks badan

mysql - SQL mengenal pasti data yang berbeza dalam dua jadual

Terdapat dua jadual dengan kira-kira 10,000 baris Kami perlu menanyakan baris dengan perbezaan Kod semasa adalah seperti berikut:

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

Tetapi inilah masalahnya Kod di atas hanya boleh menanyakan baris yang berbeza, tetapi ia tidak boleh memaparkan yang dalam jadual a yang tiada dalam jadual b, dan yang dalam jadual b yang tiada dalam jadual a paparkan baris dalam lajur ketiga?

曾经蜡笔没有小新曾经蜡笔没有小新2749 hari yang lalu714

membalas semua(2)saya akan balas

  • 巴扎黑

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

    Mengikut poster asal, nombor dan versi dalam satu jadual tidak akan diulang. Cipta indeks komposit untuk nombor dan versi kedua-dua jadual, dan kemudian laksanakan sql berikut.

    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;
    下面这个效率可能会差点

    balas
    0
  • PHP中文网

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

    Cubalahfull join ... where a is null or b is null. Contohnya, menggunakan 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

    Hasil:

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

    balas
    0
  • Batalbalas