这适用于SQL Server
所以我有一个SQL视图,我通过CASE语句手动定义自定义列的值。我们调用列名StatusID
。
现在,我有一个包含StatusID
和Description
的映射表。我们打电话给表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'"
答案 0 :(得分:3)
您可以通过多种方式进行此次加入:
where
子句中重复计算列的表达式 - 这不太理想,因为重复相同的表达式,或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)