我有一个包含两列的表。 第一表 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语句。 我怎样才能最好地简化它?
答案 0 :(得分:0)
您可以在OR
子句中使用ON
来合并两个子查询。您还可以将WHERE
子句的内容移动到ON
。
SELECT DISTINCT
f.uid,
f.tid
FROM
firsttable f
INNER JOIN
secondtable s ON s.uid = f.uid
OR s.tid = f.tid
AND s.tid = ''
AND s.uid = '';
答案 1 :(得分:0)
如果您要确定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
是性能杀手。