首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql嵌套选择无效列

sql嵌套选择无效列
EN

Stack Overflow用户
提问于 2010-10-15 05:31:32
回答 4查看 2.3K关注 0票数 0

大家好,我已经在select语句上挣扎了一段时间,我希望能得到一些帮助。我目前在一个临时表中有一个IP列表,我想计算这个IP作为服务器的次数和它作为客户端的次数。无论我如何插入这个select语句,我总是得到相同的错误,告诉我ServerCount是一个无效的列,无论我用什么替换空值。下面是select语句:

代码语言:javascript
复制
select IPS, sum (ClientCount) as ClientCount, sum(ServerCount) as ServerCount
from (
       select IP as IPS, Count(*) as ClientCount, null
       from table1 join temp_table 
       on table1.client_ip = temp_table.IP
       group by IP
       union all
       select null,IP as IPS, Count(*) as ServerCount
       from table1 join temp_table 
       on table.server_ip = temp_table.IP
       group by IP
       )t
group by IPS, ClientCount, ServerCount

前半部分和后半部分在没有联合的情况下独立工作。你知道是什么导致了这个错误吗?另外,如果我使用Nulls,我也会得到第二个错误。以下是包含空值的完整错误:

Msg 8155,Level 16,State 2,Line 1没有为't‘的第3列指定列。消息207,级别16,状态1,第13行列名'ServerCount‘无效。消息207,第16级,状态1,第1行列名'ServerCount‘无效。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-15 05:41:00

在执行UNION ALL时,列的顺序应该相同。查询通常将第一个SELECT语句的名称作为列的名称。

此外,在外部查询中,我不确定为什么要按聚合列进行分组;我认为这是行不通的。我认为你想要的可能更好,比如:

代码语言:javascript
复制
SELECT tt.IP,
       (SELECT COUNT(*) FROM table1 t1 WHERE tt.IP = t1.client_ip) AS ClientCount,
       (SELECT COUNT(*) FROM table1 t2 WHERE tt.IP = t2.server_ip) AS ServerCount
FROM   temp_table tt
ORDER BY tt.IP

至少看起来简单多了。

票数 0
EN

Stack Overflow用户

发布于 2010-10-15 05:35:36

您需要在联合的第一个查询中定义servercount。同样,null可能没有任何意义。我会用零代替。

代码语言:javascript
复制
select IPS, sum (ClientCount) as ClientCount, sum(ServerCount) as ServerCount
from (
       select IP as IPS, Count(*) as ClientCount, 0 as serverCount
       from table1 join temp_table 
       on table1.client_ip = temp_table.IP
       group by IP
       union all
       select IP as IPS,0 as ClientCount, Count(*) as ServerCount
       from table1 join temp_table 
       on table.server_ip = temp_table.IP
       group by IP
       )t
group by IPS, ClientCount, ServerCount
票数 3
EN

Stack Overflow用户

发布于 2010-10-15 05:37:19

子查询中的第一个SELECT需要定义所有列名,因此您需要更改:

代码语言:javascript
复制
select IP as IPS, Count(*) as ClientCount, null

代码语言:javascript
复制
select IP as IPS, Count(*) as ClientCount, null AS ServerCount

另外,我将更改子查询中的第二个SELECT语句,使列的顺序相同:

代码语言:javascript
复制
select IP as IPS, null AS ClientCount, Count(*) as ServerCount
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3937759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档