Tsql 条件上的T-SQL联接表

Tsql 条件上的T-SQL联接表,tsql,join,Tsql,Join,我有一个从4个表中选择的程序。根据输入变量,我想加入并显示2或全部4。因此,如果@var=1,则只输出表1和表2,如果@var=2,则输出所有4个表的连接。 我尝试的是: 从t1中选择* 在t1.pk1=t2.pk1上连接t2 在t2.pk2=t3.pk2上左连接t3,CASE@var=2,然后1 ELSE=0 END=1 左连接t3.pk3=t4.pk3上的t4和CASE@var=2,然后1 ELSE=0 END=1 但输出仅针对变量=2显示,否则输出为空 实际上,我有更多的表连接在一起,这

我有一个从4个表中选择的程序。根据输入变量,我想加入并显示2或全部4。因此,如果@var=1,则只输出表1和表2,如果@var=2,则输出所有4个表的连接。 我尝试的是:

从t1中选择*
在t1.pk1=t2.pk1上连接t2
在t2.pk2=t3.pk2上左连接t3,CASE@var=2,然后1 ELSE=0 END=1
左连接t3.pk3=t4.pk3上的t4和CASE@var=2,然后1 ELSE=0 END=1
但输出仅针对变量=2显示,否则输出为空

实际上,我有更多的表连接在一起,这两个表仅用于WHERE部分(更多过滤)。当我没有从t3和t4中得到任何要过滤的列时,我希望在没有与这些表连接的情况下显示所有内容。当我要从t3和t4中筛选数据时,我需要将它们连接起来,并在WHERE子句中使用它们

编辑:
所以最终的解决方案是这样的:

IF(@var=2)
开始
从t1中选择*
在t1.pk1=t2.pk1上连接t2
t2.pk2上的左连接t3=t3.pk2
左连接t3.pk3上的t4=t4.pk3
结束
其他的
开始
从t1中选择*
在t1.pk1=t2.pk1上连接t2
结束

你在找这个吗

让我们创建一个模拟场景来模拟您的问题:

DECLARE @t1 TABLE(ID INT IDENTITY,SomeValue VARCHAR(100));
DECLARE @t2 TABLE(ID INT IDENTITY,t1ID INT /*FK to t1*/,SomeValue VARCHAR(100));
DECLARE @t3 TABLE(ID INT IDENTITY,t2ID INT /*FK to t2*/,SomeValue VARCHAR(100));
DECLARE @t4 TABLE(ID INT IDENTITY,t3ID INT /*FK to t3*/,SomeValue VARCHAR(100));

INSERT INTO @t1 VALUES('Row 1'),('Row 2');
INSERT INTO @t2 VALUES(1,'Row 1.1'),(1,'Row 1.2'),(2,'Row 2.1');
INSERT INTO @t3 VALUES(1,'Row 1.1.1'),(1,'Row 1.1.2'),(2,'Row 1.2.1'),(3,'Row 2.1.1');
INSERT INTO @t4 VALUES(1,'Row 1.1.1.1'),(1,'Row 1.1.1.2'),(4,'Row 2.1.1.1'),(4,'Row 2.1.1.2');
--现在我们需要您的变量
@var

DECLARE @var INT;
--我们可以将其设置为1或2(或者不设置,即
NULL

--使用各种输入检查查询结果:

SELECT * 
FROM @t1 t1  
INNER JOIN @t2 t2 ON t1.ID = t2.t1ID
LEFT JOIN @t3 t3 ON t2.ID = t3.t2ID AND ISNULL(@var,1)=1
LEFT JOIN @t4 t4 ON t3.ID = t4.t3ID AND ISNULL(@var,1)=1;
简而言之:

在任何情况下,
@var
为neiter
NULL
1

1
NULL
都将被视为
1
。任何其他值都不等于
1


但我不确定,如果我真的得到了你需要的

为什么不简单地使用
IF语句
并放置特定的查询?另外,请查看
连接
,您正在执行
内部连接
,这意味着如果您发送@var=2,您将永远无法从该查询中获得任何信息,如果您真的想这样做,您应该使用
左连接
,这就是解决方案,我不够开明:)现在我有两个很长的选择,用小if除以。你试过在t3和t4上放置
LEFT JOIN
而不是
JOIN
吗?是的,我在笔记中有它们,但忘了添加它们。已经Edited@Error404,您的最终解决方案很好(可能是最佳选择!),但它是过程性的,因此在视图或iTVFs中没有任何用处-这是一个很大的倒退。。。
SELECT * 
FROM @t1 t1  
INNER JOIN @t2 t2 ON t1.ID = t2.t1ID
LEFT JOIN @t3 t3 ON t2.ID = t3.t2ID AND ISNULL(@var,1)=1
LEFT JOIN @t4 t4 ON t3.ID = t4.t3ID AND ISNULL(@var,1)=1;