在案例中嵌套sql查询

时间:2010-09-03 02:10:09

标签: sql sql-server tsql sql-server-2008

我正在尝试编写一个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查询似乎不起作用,我把它扔给你们。有这个问题的想法吗?

希望我充分解释了这个问题。如果您不确定,请发表评论,以便澄清。

提前干杯!

3 个答案:

答案 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