我有2个表,它们由左连接连接。
表1:
表2:
根据表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
答案 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
答案 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)