根据1值选择不同的值

时间:2013-12-04 09:27:06

标签: sql sql-server-2012

我有2个表,它们由左连接连接。

表1:

  • Id(int)
  • 姓名(字符串)

表2:

  • Id(int)
  • Table1Id(int)
  • 允许(位)

根据表1中保存的名称,我可以获取表2中的所有记录。当表2中的一个或多个记录的值为allowed = 0时,我的查询结果应该返回0.我尝试使用min( ),但它不支持位值,我尝试将它们转换为整数值,但似乎也不起作用。我到底该怎么做?

为了澄清,我希望看到所有存在的记录。仅当表2中的一个记录的值为0(允许)时,查询结果才应显示为0

这样的东西可以解决问题,但我不知道要使用哪个聚合函数,所以我可以分组购买Table1.Name

SELECT Table1.Name, Table2.Allowed  
FROM Table1  
LEFT JOIN Table2 on Table1.Id = Table2.Table1Id  
GROUP BY Table1.Name

3 个答案:

答案 0 :(得分:1)

SELECT Table1.Name, min(case when Table2.Allowed = 0 then 0 else 1 end)
FROM Table1
LEFT JOIN Table2 on Table1.Id = Table2.Table1Id
GROUP BY Table1.Name

SQLFiddle demo

答案 1 :(得分:0)

虽然问题可能不太明确,但我找到了解决问题的第二个方案:

SELECT [Name] AS [Name], MIN(Allowed)   
FROM(

SELECT [Table1].[Name] AS [Name],   
CAST(ISNULL([Table2].[Allowed], 1) as int) AS [allowed]  
FROM [Table1] AS [T1]  
LEFT JOIN [Table2] AS [T2] on [T1].[Id] = [T2].[Table1Id]  
) AS [Records]  

GROUP BY [Name]

在SSMS中运行时,查看执行计划,与Juergen的答案没有区别。查询成本各为50%,图形路径相同

答案 2 :(得分:0)

这里最好的选择是使用子查询,你可以从那个聚合工作负载中保存你的cpu。

选择t1.name,允许为0 来自table1 t1 其中t1.id in(从table2 t2中选择t2.table1id,其中t2.allowed = 0)