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

具有左联接但不显示联接表内数据的选择

  •  1
  • tung  · 技术社区  · 10 年前

    我有一个有两张桌子的桌子结构

    像这样的桌上人:

    id name etc.   
    1  test   
    2  smith  
    3  shaw
    

    还有第二张桌子,我记录了名字的变化,比如:所以如果有人因为结婚或类似的事情而改变了他的名字,我仍然使用旧名字。

    id personid name    etc.
    1     1     oldtest
    

    现在我有以下查询

    select * from person p
    Left join personhist ph on p.id = ph.personid
    where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));
    

    此查询将产生以下结果

    id name    id personid name
    1  test    1  1        oldtest
    

    但我只想得到实际的名字结果。所以问题是:如果我加入的表中有一条记录,是否有一种方法只显示“主”表中的数据?

    3 回复  |  直到 7 年前
        1
  •  3
  •   juergen d    10 年前
    select p.*, coalesce(p.name, ph.name)
    from person p
    Left join personhist ph on p.id = ph.personid
    where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'))
    
        2
  •  2
  •   Lalit Kumar B    10 年前

    但我只想得到实际名称的结果。所以问题是,如果我所连接的表中有记录,是否有一种方法只显示“主”表中的数据?

    只需不包括不想显示的列。您正在使用 选择* 这实际上在任何生产系统上都不是一件好事。您应该只指定那些必需的列名。

    如果您确实想显示其中一个表的所有列,那么在查询中,您已经有了 别名 对于表名,使用相同的别名仅包含该表的列。

    select p.* -这将包括表的所有列 persons 别名为 p .

    select ph.* -这将包括表的所有列 personhist 别名为 ph .

    要仅包含选定的列,请明确提及它们。例如-

    select p.id, p.name, ph.personid...

    我想你需要的是-

    select p.*, ph.personid 
      from person p
     Left join personhist ph on p.id = ph.personid
    where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));
    

    但我真的怀疑 参加 当您只需要显示第一个表时。

        3
  •  0
  •   David Faber    10 年前

    正如其他人所提到的(我不会再赘述),您可以通过在 SELECT 例如:

    select p.name from person p
      Left join personhist ph on p.id = ph.personid
     where (upper(p.name) = upper('oldtest') or upper(ph.name) like upper('oldtest'));
    

    但我想谈一个单独的问题。为什么要使用 LIKE 在这种情况下?没有任何通配符,因此可以使用 = 同样容易。此外,您可以执行以下操作:

    SELECT p.name
      FROM person p LEFT JOIN personhist ph
        ON p.id = ph.personid
     WHERE 'OLDTEST' IN ( UPPER(p.name), UPPER(ph.name) );
    

    如果您正在搜索以开头的历史名称 OLDTEST 那么您应该这样做:

    SELECT p.name
      FROM person p LEFT JOIN personhist ph
        ON p.id = ph.personid
     WHERE ( UPPER(p.name) = UPPER('oldtest')
          OR UPPER(ph.name) LIKE UPPER('oldtest') || '%');
    

    最后,确保在 PERSON (也许还有一个 PERSONHIST 以及)沿着以下线:

    CREATE INDEX person_name_upper ON person ( UPPER(name) );