我正在尝试编写一个SQL查询,我将连接两个表并检索几列。完成此操作后,基于两个字段(源表枚举,相应源表中的id),我需要检索与源表中的id匹配的值。
问题是我无法加入所有源表,并希望做这样的事情:
Select
X.Col1,
X.Col2,
Y.Col1,
Y.Col2,
CASE
WHEN Y.TableID = 4 THEN Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID
WHEN Y.TableID = 5 THEN Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID
END
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID
我可以保证从所有源表中检索的值都是相同的(即nvarchar)。
在CASE语句中嵌套SQL查询似乎不起作用,我把它扔给你们。有这个问题的想法吗?
希望我充分解释了这个问题。如果您不确定,请发表评论,以便澄清。
提前干杯!
答案 0 :(得分:3)
使用括号将SELECT封装在CASE表达式中:
Select X.Col1,
X.Col2,
Y.Col1,
Y.Col2,
CASE
WHEN Y.TableID = 4 THEN (Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID)
WHEN Y.TableID = 5 THEN (Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID)
END
FROM Table X
JOIN Table Y ON X.ID = Y.XID
...但我想强调这是一个糟糕的设计选择。您可以改为使用LEFT JOIN:
Select X.Col1,
X.Col2,
Y.Col1,
Y.Col2,
CASE
WHEN Y.TableID = 4 AND t4.Col1 IS NOT NULL THEN t4.Col1
WHEN Y.TableID = 5 AND t5.Col4 IS NOT NULL THEN t5.Col4
END
FROM Table X
JOIN Table Y ON X.ID = Y.XID
LEFT JOIN TABLEFOUR t4 ON t4.id = y.fileid
LEFT JOIN TABLEFIVE t5 ON t5.id = y.fileid
答案 1 :(得分:1)
我不明白你的意思是“无法加入所有源表”,你能详细说明吗? 我会使用外连接:
Select
X.Col1,
X.Col2,
Y.Col1,
Y.Col2,
COALESCE(t4.Col1 ,t5.Col4)
END
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID
LEFT OUTER JOIN TableFour t4 ON t4.id = Y.FileID AND Y.TableID = 4
LEFT OUTER JOIN TableFive t5 ON t5.id = Y.FileID AND Y.TableID = 5
答案 2 :(得分:0)
我可能会为此写一个函数:
CREATE FUNCTION dbo.GetVal
(@tblNum int, @FileID int)
RETURNS nvarchar(255)
AS
BEGIN
Declare @return nvarchar(255);
if @tblNum = 4 then
Select @return=t4.Col1 FROM TableFour t4 WHERE t4.id = @FileID;
else
if @tblNum =5
Select @return=t5.Col4 FROM TableFive t5 WHERE t5.id = @FileID;
return @return
END;
然后您的选择看起来像:
Select
X.Col1,
X.Col2,
Y.Col1,
Y.Col2,
dbo.GetVal(Y.TableID, Y.FileID)
FROM Table X INNER JOIN Table Y ON X.ID = Y.XID