Присоединяйтесь к таблице, только если значение столбца равно true - PullRequest
3 голосов
/ 14 января 2009

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

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

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

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

Ответы [ 6 ]

3 голосов
/ 14 января 2009
select * 
from T1
join T2 
  on  T1.value = T2.value
  and T1.booleancolumn = 1
where T2.value2 = 'variable2'
and T2.value3 = 'variable3';
1 голос
/ 14 января 2009

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

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

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

0 голосов
/ 14 января 2009

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

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'
0 голосов
/ 14 января 2009

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

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

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

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

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

0 голосов
/ 14 января 2009

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

SELECT * FROM T1
INNER JOIN T2 
  ON T1.Value = T2.Value
WHERE T2.Value2 = 'variable2'
AND T2.Value3 = 'variable3'
AND T1.booleancolumn = 1
0 голосов
/ 14 января 2009

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

Я думаю вы можете использовать чехол в ГДЕ.

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