Присоединяйтесь к таблицам, которые могут не иметь записей - PullRequest
0 голосов
/ 15 мая 2018

У меня есть две таблицы: tableA с списком записей и tableB с ограничениями (если есть). Как можно объединить таблицы, которые по сути будут inner join, если в tableB есть записи, или нет объединения, если tableB пусто?

то есть:

tableA
id | name 
1 | val1
2 | val2

tableB (with restrictions)
id | name | userID
1 | val1 | 123

OR tableB (no restrictions)
id | name | userID

это возможно? Моя попытка ниже:

    SELECT a.*
    FROM tableA a
    INNER JOIN (CASE WHEN select 1 from tableB = 1 THEN tableB ELSE tableA END) b
    ON a.id = b.id
where userID = XXX

РЕДАКТИРОВАТЬ : есть проверка на таблице B

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Просто используйте левое соединение

SELECT a.*
FROM tableA a
LEFT JOIN tableB b = ON a.id = b.id and b.userid = xxx

В настоящее время я не вижу никаких сложностей, кроме этого - учитывая простоту утверждения в исходном вопросе, мне интересно, если вы ставите предикаты WHERE противтаблица B - если вы есть, они должны быть в предложении ON объединения

Отредактировано, чтобы включить перемещенное предложение where.

0 голосов
/ 15 мая 2018

будет извлекать все записи из tableA, если tableB пусто, и только соответствующие записи, если это не так:

select a.id, a.name 
from tableA a
    join tableB on a.id = b.id
where exists (select 1 from tableB)
union all
select a.id, a.name 
from tableA a
where not exists (select 1 from tableB)
0 голосов
/ 15 мая 2018

Для пустых строк вы можете использовать один и тот же запрос для обоих ограничений.Я полагаю, вы используете SQL server

Используйте левое объединение для извлечения строк, если таблица b пуста

select a.id,a.name 
    from tableA a left join tableB on a.id = b.id

Демо:

declare @tableA table (id int, name varchar(10))
insert into @tableA
select 1, 'name'
union all
select 2,'name1'
union all
select 3,'name2'

declare @tableb table (id int, name varchar(10))

select a.id,a.name 
from @tableA a left join @tableb b on a.id = b.id
...