2015-06-05 7 views
0

Если у вас есть что-то вроде нижеДополнительно в разделе

SELECT column1 
FROM table1 
WHERE id IN (SELECT column2 FROM table2 WHERE id2 = 'x') 

У меня есть сценарий, где в пункте может не возвращать никаких данных, что означает, что я должен получить все данные, а не 0 строк, как если бы в статье было никогда не создавался. Я тоже не могу объединиться.

+1

Вы хотите сказать, что вам нужно оценить подзапрос, увидеть, если она возвращает 0 строк, и если это произойдет - то вы не должны использовать его? – Cortright

ответ

2

Вы пробовали:

select column1 from table1 
where id in (select column2 from table2 where id2 = 'x') 
     OR IF NOT EXISTS (select column2 from table2 where id2 = 'x') 

Это будет использовать идентификатор пункта, если строки возвращаются, но игнорировать его, если 0 строк.

Предостережение: я не знаю последствий для производительности больших наборов данных и того, как это может сделать оптимизатор запросов.

0

В какой базе данных вы работаете?

Вы можете сделать это в SQL Server (но опять же, вы можете сделать соединений в SQL Server):

IF EXISTS (select column2 from table2 where id2 = 'x') 
BEGIN 
    select column1 from table1 where id in (select column2 from table2 where id2 = 'x') 
END 
ELSE 
BEGIN 
    select column1 from table1 
END 
1

Попробуйте что-то вроде этого, используя КТР (общее выражение таблицы)

with filter as 
(
    select distinct 
     t2.column2 as id 
    from table2 t2 
    join table1 t1 on t1.id = t2.column2 
       and t2.id2 = 'x' 
) 
select t1.* 
from  table1 t1 
left join filter f on f.id = t1.id 
where f.id is not null     -- matched the filter 
    OR 0 = (select count(*) from filter) -- filter is empty 
0

я, что это будет делать трюк
Если я понимаю, что вы ищете

select column1 
    from table1 
    left join table2 
    on table1.id = table2.colum2 
where table2.colum2 = 'x' 
    or table2.colum2 is null 

TLDR Почему вы не можете присоединяться?

Не уверен, что они синтаксис работает, но что-то вроде этого
Снова, почему вы не можете присоединиться?
Но при таком подходе ответ от Мартина лучше

where id in (select column2 from table2 where id2 = 'x') 
    or (select count(*) from table2 where id2 = 'x') = 0 
Смежные вопросы