加入可能没有记录的表

时间:2018-05-15 14:35:25

标签: sql sql-server join case

我有两个表,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

编辑:对tableB进行检查

3 个答案:

答案 0 :(得分:3)

只需使用左连接

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

我目前没有看到任何复杂性 - 鉴于原始问题中语句的简单性,我想知道你是否将WHERE谓词放在表B上 - 如果你是,他们需要在联接的ON子句

编辑以包括移动的where子句。

答案 1 :(得分:2)

对于空行,您可以对两个限制使用相同的查询。 我想你是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

答案 2 :(得分:1)

如果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)