【问题标题】:sql nested select invalid columnsql嵌套选择无效列
【发布时间】:2010-10-14 21:31:32
【问题描述】:

大家好, 我一直在为一个 select 语句苦苦挣扎,我希望能得到一些帮助。我目前在临时表中有一个 IP 列表,我想计算这个 IP 充当服务器的次数以及充当客户端的次数。无论我如何操作这个 select 语句,我总是得到同样的错误,告诉我 ServerCount 是一个无效的列,无论我用什么替换空值。这是选择语句:

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,我也会收到第二个错误。这是带有空值的完整错误:

消息 8155,第 16 级,状态 2,第 1 行 没有为“t”的第 3 列指定任何列。 消息 207,第 16 层,状态 1,第 13 行 列名“ServerCount”无效。 消息 207,第 16 层,状态 1,第 1 行 列名“ServerCount”无效。

谢谢。

【问题讨论】:

  • 我会指出,当您在联合中使用 NUll 在第一个选择中创建列时,它将默认为整数数据类型。这很好,但如果它是你想要的 varchar 或 date 或 decimal 字段,你应该使用类似 CAST(null as varchar(10)) 的东西。
  • 将您的 SQL 与您询问 this question 时给出的答案进行比较,您会发现 IP 应该是两个 SELECT 语句中的第一列。

标签: sql sql-server database sql-server-2005


【解决方案1】:

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

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

【讨论】:

  • 您在第二次选择中的列顺序错误,所以我修复了它们。
【解决方案2】:

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

另外,在外部查询中,我不确定您为什么按聚合列分组;我认为这行不通。我认为你想要的东西可能会更好地服务于:

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

至少看起来要简单得多。

【讨论】:

    【解决方案3】:

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

    select IP as IPS, Count(*) as ClientCount, null
    

    select IP as IPS, Count(*) as ClientCount, null AS ServerCount
    

    另外,我会更改子查询中的第二个 SELECT 以使列以相同的顺序排列:

    select IP as IPS, null AS ClientCount, Count(*) as ServerCount
    

    【讨论】:

      【解决方案4】:

      您的查询无效:

      select
          IPS,
          sum(ClientCount) as ClientCount,
          sum(ServerCount) as ServerCount
      from (
          select
              IP as IPS,
              Count(*) as ClientCount,
              null as ServerCount
          from table1 join temp_table 
          on table1.client_ip = temp_table.IP
          group by IP
      
          union all
      
          select
              null,
              IP as IPS,
              Count(*)
          from table1 join temp_table 
          on table.server_ip = temp_table.IP
          group by IP
      )t
      group by IPS, ClientCount, ServerCount
      

      当您有一个联合时,它们会从第一个查询中获取列别名。您的第一个查询需要指定 ServerCount 列名

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2020-12-07
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多