我有一个从4个表中进行选择的过程。根据输入变量,我要联接并显示2或全部4。因此,如果@var = 1,则仅输出table1和table2,如果输出@var = 2,则输出所有4个表的联接。 我尝试过的是:
SELECT * FROM t1
JOIN t2 ON t1.pk1 = t2.pk1
LEFT JOIN t3 ON t2.pk2 = t3.pk2 AND CASE @var = 2 THEN 1 ELSE = 0 END = 1
LEFT JOIN t4 ON t3.pk3 = t4.pk3 AND CASE @var = 2 THEN 1 ELSE = 0 END = 1
但是仅在变量= 2时显示输出,否则输出为空。
实际上,我有更多的表连接在一起,而这2个仅在WHERE部分才需要(更多过滤)。当我没有要从t3和t4进行过滤的列时,我想显示所有内容而与这些表没有任何联系。当我有数据要从t3和t4进行过滤时,我需要将它们加入并在WHERE子句中使用它们。
编辑:
所以最终的解决方案是这样的:
IF (@var = 2)
BEGIN
SELECT * FROM t1
JOIN t2 ON t1.pk1 = t2.pk1
LEFT JOIN t3 ON t2.pk2 = t3.pk2
LEFT JOIN t4 ON t3.pk3 = t4.pk3
END
ELSE
BEGIN
SELECT * FROM t1
JOIN t2 ON t1.pk1 = t2.pk1
END
答案 0 :(得分:0)
您在寻找这个吗?
让我们创建一个样机场景来模拟您的问题:
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
)
--SET @var=1; --show all
SET @var=2; --just t1 and t2
-使用各种输入检查查询结果:
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;
简而言之:
在任何情况下,ON
都是FALSE
或AND
的情况下,@var
子句都将由于NULL
而返回1
。
值1
和NULL
都将被视为1
。其他任何值都将不等于1
。
但是我不确定,如果我真的满足了您的需求...