是否可以在用户计算/自定义SQL视图列上进行连接?

时间:2017-08-14 18:26:03

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

这适用于SQL Server

所以我有一个SQL视图,我通过CASE语句手动定义自定义列的值。我们调用列名StatusID

现在,我有一个包含StatusIDDescription的映射表。我们打电话给表dbo.StatusMapping。是否可以在StatusMapping.StatusID和我的自定义视图列“StatusID”上进行加入,以便我可以获取Description以便将其添加到我的视图中?

示例代码:

SELECT
    DISTINCT(a.OverallID),
    CASE
        WHEN a.IsTrue is null THEN 1 ELSE 2
    END AS StatusID, --This is what I'm trying to join my table on
    b.Description
FROM dbo.[MainTable] as a
JOIN dbo.[StatusMapping] as b on b.StatusID = StatusID --This is where it fails. "Invalid column name 'StatusID'"

3 个答案:

答案 0 :(得分:3)

您可以通过多种方式进行此次加入:

  • where子句中重复计算列的表达式 - 这不太理想,因为重复相同的表达式,或
  • 使用公用表表达式 - 这适用于SQL Server,但不适用于MySQL和其他不支持CTE的RDBMS,或
  • 使用表格别名制作嵌套select - 这样可以避免重复。

以下是如何使用嵌套select

的示例
SELECT
    DISTINCT(x.OverallID),
    x.StatusID,
    b.Description
FROM (
    SELECT
        a.OverallID,
        CASE
            WHEN a.IsTrue is null THEN 1 ELSE 2
        END AS StatusID
    FROM dbo.[MainTable] as a
) AS x
JOIN dbo.[StatusMapping] as b on b.StatusID = x.StatusID

注意:我不确定原始查询中DISTINCT周围a.OverallID的用途。我将其机械地复制到查询中,但很有可能它是不必要的,或者您需要将其替换为GROUP BY

答案 1 :(得分:2)

您只需要在JOIN中使用整个case语句。密切关注表现。

SELECT
    DISTINCT
        ( a.OverallID ) ,
        CASE WHEN a.IsTrue IS NULL THEN 1
             ELSE 2
        END AS StatusID ,
        b.Description
FROM    dbo.[MainTable] AS a
        JOIN dbo.[StatusMapping] AS b ON b.StatusID = CASE WHEN a.IsTrue IS NULL
                                                           THEN 1
                                                           ELSE 2
                                                      END

答案 2 :(得分:1)

您可以查询第一个表并计算子查询中的StatusID,然后将结果连接到表b。

SELECT a.OverallID
    , a.StatusID
    , b.Description
FROM (
    SELECT mt.OverallID
        , CASE WHEN a.IsTrue IS NULL THEN 1 
            ELSE 2 
          END AS [StatusID]
) a
    JOIN dbo.[StatusMapping] AS b ON (b.StatusID = a.StatusID)