Присоединяться к таблице только тогда, когда значение столбца истинно

Я использую SQL Server 2005. Я пытаюсь объединить две таблицы, но только тогда, когда значение столбца в основной таблице истинно. Как это:

select * from T1
join T2 on T1.value = T2.value
where T2.value2 = 'variable2'
and T2.value3 = 'variable3'

В T1 есть значение столбца, которое говорит, нужно ли мне использовать значения в T2. Я мог бы рассмотреть случай с предложением where, но он всегда будет присоединяться к таблице, и если значение в T1 ложно, в T2 нет значений для присоединения, поэтому выбор не возвращает строк.

Вы не можете положить футляр вокруг соединения, так что я немного застрял с этим ... может кто-нибудь помочь?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
3 368
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

select * 
from T1
join T2 
  on  T1.value = T2.value
  and T1.booleancolumn = 1
where T2.value2 = 'variable2'
and T2.value3 = 'variable3';

Возможно, я неправильно понял ваш вопрос, но вот мое предположение.

И считать вы можете использовать случай в ГДЕ.

select * from T1
join T2 on T1.value = T2.value
where T2.value2 = case T1.useT2 when 'yes' then 'variable2' else T2.value2 END
and T2.value3 = case T1.useT2 when 'yes' then 'variable3' else T2.value3 END

Подобно тому, что опубликовал Дэйв, но я также читал, что это означает, что вы действительно хотите подставлять значения в результаты. В этом случае:

SELECT
    COALESCE(T2.Value, T1.Value) AS Value, 
    COALESCE(T2.Value2, T1.Value2) AS Value2,
    COALESCE(T2.Value3, T1.Value3) AS Value3
FROM T1
LEFT JOIN T2 ON T2.value = T1.value 
    AND T2.Value2= @Variable2 AND T2.Value3 = @Variable3

Обратите внимание, что я тоже отношусь к вашим константам как к реальным переменным.

Очень похоже на то, что сказал Дэйв, хотя я бы поставил проверку логического столбца в ГДЕ, чтобы что-то вроде этого

SELECT * FROM T1
INNER JOIN T2 
  ON T1.Value = T2.Value
WHERE T2.Value2 = 'variable2'
AND T2.Value3 = 'variable3'
AND T1.booleancolumn = 1
Ответ принят как подходящий

Дэйв Марк прав, но в целом ...

условное соединение - это ответ на ваш вопрос, попробуйте найти ресурсы в Интернете, например

http://weblogs.sqlteam.com/jeffs/archive/2007/04/03/Conditional-Joins.aspx

http://bytes.com/groups/ms-sql/641690-difference-condition-join-where

это очень мощный метод для создания соединений в зависимости от данных в таблицах

Интересно, какие соображения производительности связаны с условными соединениями, если таковые имеются? Эквивалентно ли это UNION:

SELECT T1.* 
  FROM T1
  WHERE T1.use_t2 = FALSE
  AND T1.value2 = 'variable2'
  AND T1.value3 = 'variable3'
UNION ALL
SELECT T2.* 
  FROM T1 JOIN T2 ON T1.value = T2.value
  WHERE T1.use_t2 = TRUE
  AND T2.value2 = 'variable2'
  AND T2.value3 = 'variable3'

Другие вопросы по теме