尽管查看了相关的条件联接问题,但我还是无法做到以下几点。
我的表VillageId Date
--------------------
1 2/4/2017
2 2/9/2018
包含t
列和ID
列以及外部参数Value
。
如果@Option
我想加入包含@Option = 'a'
和a
列的ID
表,其中Flag
为Y / N.
如果Flag
我想加入只有@Option = 'b'
列的表b
,并且匹配ID的存在表明ID
。
所以我想要的是像
Flag='Y'
但我不确定如何设置等效的IF @Option = 'a'
SELECT
t.ID
,t.Value
,a.Flag
FROM t
INNER JOIN a
ON t.ID = a.ID
ELSE IF @Option = 'b'
SELECT
t.ID
,t.Value
,CASE WHEN b.ID IS NULL THEN 'N' ELSE 'Y' END AS Flag
FROM t
LEFT JOIN b
ON t.ID = b.ID
语句。
我怎样才能做到这一点?
一个不受欢迎的解决方案是忽略外部参数并返回两个标志列,例如:
IF
但我真的更喜欢只有一列,而且这个查询很慢。
答案 0 :(得分:2)
使用union
SELECT
t.ID
,t.Value
,a.Flag
FROM t
INNER JOIN a
ON t.ID = a.ID
where @Option = 'a'
union all
SELECT
t.ID
,t.Value
,CASE WHEN b.ID IS NULL THEN 'N' ELSE 'Y' END AS Flag
FROM t
LEFT JOIN b
ON t.ID = b.ID
where @Option = 'b'
答案 1 :(得分:1)
您还可以在@Operation
和JOIN
中检查参数CASE
的值。
SELECT
t.ID
,t.Value
,CASE
WHEN @Operation = 'a' THEN
CASE WHEN a.Flag IS NULL
THEN 'N' ELSE a.Flag
END
WHEN @Operation = 'b'THEN
CASE WHEN b.ID IS NULL
THEN 'N' ELSE 'Y'
END
END AS Flag
FROM t
LEFT JOIN a
ON t.ID = a.ID AND @Operation = 'a'
LEFT JOIN b
ON t.ID = b.ID AND @Operation = 'b'
在您的第一个查询中,您将使用a
加入表格INNER JOIN
,因此,如果您想模拟这一点,可以添加WHERE
,如下所示:
WHERE @Operation = 'b' OR (@Operation = 'a' AND a.Id IS NOT NULL)