任何人都可以解释我如何在条件的基础上使用加入。 让我说我现在根据一个条件过滤数据我现在担心的是,如果一个特定的BIT类型参数值是1,那么数据集包括另一个加入,其他返回与之前相同。 这是三个表A,B,C 现在我想创建一个具有@bool位参数
的procif @bool=0
then
select A.* from A
inner join B on B.id=A.id
and if @bool=1
then
select A.* from A
INNER JOIN B on B.id=A.id
inner join C on C.id=A.id
提前致谢。
答案 0 :(得分:1)
你有什么工作(当然在MS SQL Server的SPROC中),使用较小的mod。
if @bool=0 then
select A.* from A
inner join B on B.id=A.id
else if @bool=1 then -- Or just else if @boll is limited to [0,1]
select A.* from A
INNER JOIN B on B.id=A.id
inner join C on C.id=A.id
但是,需要注意的是,SQL参数嗅探将缓存其下降的第一个路径的计划,这对于通过代码的其他路径不一定是最佳的。
另外,如果你对你的procs采用这种“多种替代查询”方法,通常最好确保返回的列名和类型在所有情况下都是相同的(你的查询很好,因为它是A. *)。
修改强> 假设您使用的是SQL Server,另一种方法是使用动态sql:
DECLARE @sql NVARCHAR(MAX)
SET @sql = N'select A.* from A
inner join B on B.id=A.id'
IF @bool = 1
SET @sql = @sql + N' inner join C on C.id=A.id'
sp_executesql @sql
如果您需要添加过滤器等,请查看此帖子:Add WHERE clauses to SQL dynamically / programmatically
答案 1 :(得分:0)
你使用联盟:
SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
WHERE bool = 0
UNION ALL
SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
INNER JOIN C on C.id=A.id
WHERE bool = 1
我假设bool
存储在表A
或B
中。
答案 2 :(得分:0)
select A.* from A
inner join B on B.id = A.id
left outer join C on C.id = A.id and @bool = 1
where (@bool = 1 and C.id is not null) or @bool = 0
@bool = 1
“激活”左外连接,可以这么说,并通过将其应用于WHERE
子句,实际上将其转换为内连接。如果@bool = 0
,那么左外连接将从C返回任何内容,并删除WHERE
限制。
答案 3 :(得分:0)
尝试以下查询
SELECT A.*
FROM A
INNER JOIN B on B.id=A.id
INNER JOIN C on C.id=A.id and @bool=1