我有两个表,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进行检查
答案 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)