Sql server 存在时,联接表在选择用例中不可用()
我发现下面的代码不起作用。如果存在从T2中选择1,则T2表不可用。我现在想了解为什么它不可用,以及关于谁应该编写更好的代码的一些建议。我知道,当T2.cnt>=1时,我可以用CASE替换,但我从一开始就计划在连接子选择中不使用cnt列Sql server 存在时,联接表在选择用例中不可用(),sql-server,Sql Server,我发现下面的代码不起作用。如果存在从T2中选择1,则T2表不可用。我现在想了解为什么它不可用,以及关于谁应该编写更好的代码的一些建议。我知道,当T2.cnt>=1时,我可以用CASE替换,但我从一开始就计划在连接子选择中不使用cnt列 SELECT T1.*, CASE WHEN EXISTS (SELECT 1 FROM T2) THEN "ONE" ELSE 'TWO' END AS 'Test' FROM T AS T1 LEFT JOIN ( SELE
SELECT T1.*,
CASE WHEN EXISTS (SELECT 1 FROM T2) THEN "ONE" ELSE 'TWO' END AS 'Test'
FROM T AS T1
LEFT JOIN (
SELECT T.BK, count(*) as cnt
FROM T
WHERE T.filter > 50
GROUP BY T.BK
) as T2 on T1.BK = T2.BK
不,您不能在SELECT中的子查询中引用T2,因为T2是FROM中子查询的别名;它在该子查询中没有上下文。但是,看起来在FROM中不需要该子查询,它应该位于EXISTS中,因为在SELECT中不返回T2中的任何列:
选择T1.*-定义列,而不是使用*
案例存在时选择1
从T2开始
其中T2.filter>50
T1.BK=T2.BK,然后是‘一’或‘二’——我想你指的是‘一’。双引号用于对象名称
作为测试结束-不要对对象名/别名使用单引号,它们是用于文本字符串
从T到T1;
如果上述情况正确,那么您甚至不需要子查询,您可以使用一些窗口条件聚合:
选择T1.*-定义列,而不是使用*
CASE COUNTCASE当T1.filter>50时,1结束于T1.BK的分区,当0时,则“两个”,否则“一个”结束为测试
从T到T1;
不,您不能在SELECT中的子查询中引用T2,因为T2是FROM中子查询的别名;它在该子查询中没有上下文。但是,看起来在FROM中不需要该子查询,它应该位于EXISTS中,因为在SELECT中不返回T2中的任何列:
选择T1.*-定义列,而不是使用*
案例存在时选择1
从T2开始
其中T2.filter>50
T1.BK=T2.BK,然后是‘一’或‘二’——我想你指的是‘一’。双引号用于对象名称
作为测试结束-不要对对象名/别名使用单引号,它们是用于文本字符串
从T到T1;
如果上述情况正确,那么您甚至不需要子查询,您可以使用一些窗口条件聚合:
选择T1.*-定义列,而不是使用*
CASE COUNTCASE当T1.filter>50时,1结束于T1.BK的分区,当0时,则“两个”,否则“一个”结束为测试
从T到T1;