2016-09-15 2 views
-1

пусть говорят, я хочу создать что-то вроде этогоSQL SELECT заявление в случае

select t.*, 
     (case when (select name from table2 where idtable2 = t.idtable1)= NULL then '0' 
     end) as result 
from table1 t 

, как я могу это сделать? спасибо

извините мои ошибки, да что заявление он works..but не работает, если есть подзапрос перед сазом ..

выбери т. * (Выберите имя из Table3 где idtable3 = t.idtable3), как nametable3, (случай, когда (выберите имя из table2 где idtable2 = t.idtable1) = NULL, то '0' конец) как результат от table1 т

+0

, который должен работать, но может потребоваться 'LIMIT 1'; но обычно (не всегда) быстрее просто подключиться к двум таблицам и использовать значение напрямую. – Uueerdo

+1

Вы должны объяснить логику, которую вы хотите. –

+1

Коррелированный подзапрос в списке SELECT запроса, возвращающего каждую строку в таблице. Если таблица1 содержит миллион строк, этот подзапрос будет выполняться миллион раз. * Дрожь *. (Я так хочу поставить мой мизинец пальцем в угол рта, д-р Злой стиль, когда я говорю ... «один мезеон строк».) – spencer7593

ответ

3

Я думаю, что вы хотите exists:

select t.*, 
     (case when not exists (select 1 
           from table2 t2 
           where t2.idtable2 = t.idtable1 
          ) 
      then '0' 
     end) as result 
from table1 t; 

Кроме того, ваш запрос будет работать с is null:

select t.*, 
     (case when (select t2.name 
        from table2 t2 
        where t2.idtable2 = t.idtable1 
       ) is null 
      then '0' 
     end) as result 
from table1 t; 

Это предполагает, что подзапрос возвращает одну строку.

0

Предполагая, что значение idtable2 для таблицы2 всегда уникально, вы можете сделать левое соединение с таблицей2 вместо подзапроса.

CREATE TABLE #table1 
(
    idtable1 INT 
    ,someValue varchar(25) 
) 

CREATE TABLE #table2 
(
    idtable2 INT 
    ,name varchar(25) 
) 


INSERT INTO #table1 values(1,'a'),(2,'b'),(3,'c'),(4,'d') 
INSERT INTO #table2 values(1,'Bob'),(2,'Kim'),(3,'Fred'),(5,'Sally') 

SELECT t.* 
    ,CASE 
     WHEN t2.NAME IS NULL 
      THEN '0' 
     END AS Result 
FROM #table1 t 
LEFT JOIN #table2 t2 
    ON t.idtable1 = t2.idtable2 
Смежные вопросы