SQL条件连接使用不同的连接类型和外部参数

时间:2017-07-24 07:17:11

标签: sql sql-server join

尽管查看了相关的条件联接问题,但我还是无法做到以下几点。

我的表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

但我真的更喜欢只有一列,而且这个查询很慢。

2 个答案:

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

您还可以在@OperationJOIN中检查参数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)