我有一个包含两列的表。
第一表
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
是性能杀手。