我有一个包含两列的表。
  第一表
     UID,TID

另一个表具有:
   第二表
     UID,TID,DiffColumn

给定他的UID和DiffColumn,我需要查询用户的UID或TID是否在FirstTable中。
因此,我需要与SecondTable加入以获得TID。

我尝试使用以下查询:

     SELECT F.UID, F.TID FROM
      FirstTable F
     INNER JOIN
     SecondTable S
     ON  F.UID = S.UID
     UNION
     SELECT F.UID, F.TID FROM
     FirstTable F
     INNER JOIN
     SecondTable S ON  F.TID = S.TID
     WHERE S.DiffColumn= ''
     AND S.UID = ''


但是我认为我使此查询过于复杂,而where子句仅适用于第二个select语句。
我如何最好地简化这一点?

最佳答案

如果要确定uid上的匹配优先于tid上的匹配的优先级,请使用两个left join

select f.uid, f.tid,
       coalesce(su.?, st.?) as ?  -- ? is a column you might want from secondtable
from firsttable f left join
     secondtable su
     on su.uid = f.uid left join
     secondtable st
     on st.tid = f.tid and
        st.diffcolumn = '' and
        st.uid = ''
where st.uid is not null or st.tid is not null;


另外,如果您不希望exists中的任何列,则可以仅使用secondtable

select f.*
where exists (select 1
              from secondtable su
              where su.uid = f.uid
             ) or
      exists (select 1
              from secondtable st
              where st.tid = f.tid and
                    st.diffcolumn = '' and
                    st.uid = ''
     );


尽管可以在关联子句中使用or而不是两个exists,但我强烈建议不要这样做。 or子句和相关子句中的on是性能杀手。

09-25 23:29
查看更多