代码之家  ›  专栏  ›  技术社区  ›  Moeb

如何重写SQL*PLUS中的优先级?

  •  0
  • Moeb  · 技术社区  · 15 年前
    select * from tab1
    minus
    select * from tab2
    union
    select * from tab2
    minus
    select * from tab1
    

    我怎样才能确保它被解析成这样?

    ((select * from tab1
    minus
    select * from tab2)
    union
    (select * from tab2
    minus
    select * from tab1))
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Jonathan Leffler    15 年前

    可以在FROM子句中使用带括号的表达式吗?

    SELECT *
    FROM ((select * from tab1 minus select * from tab2)
          UNION
          (select * from tab2 minus select * from tab1)) AS symdiff
    

    如果表在等效列上有主键,则可以使用:

    SELECT tab1.*
      FROM tab1
     WHERE tab1.pk NOT IN (SELECT tab2.pk FROM tab2)
    UNION -- optionally UNION ALL
    SELECT tab2.*
      FROM tab2
     WHERE tab2.pk NOT IN (SELECT tab1.pk FROM tab2)
    

    但是,这是因为没有什么可以阻止表tab1(pk,othercol)具有行(pk=1,othercol=2),而tab2(pk,othercol)包含行(pk=1,othercol=3)。这是你必须小心的一件事——我以前就被这个坏假设抓住过。