Как сделать запрос на основе поля другой таблицы? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть таблица с двумя столбцами.FirstTable UID, TID

И еще одна таблица, которая имеет: SecondTable UID, TID, DiffColumn

Мне нужно запросить, есть ли UID ИЛИ TID пользователя в FirstTable, учитывая его UID и DiffColumn,Поэтому мне нужно присоединиться к 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только ко второму оператору выбора.Как бы я лучше всего это упростил?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Если вы хотите расставить приоритеты, когда совпадение на uid имеет приоритет над совпадением на tid, тогда используйте два left join s:

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 предложениях и предложениях корреляции и быть убийцей производительности.

0 голосов
/ 20 мая 2019

Вы можете использовать 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 = '';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...