簡體   English   中英

sql嵌套選擇無效列

[英]sql nested select invalid column

大家好,我一直在為select語句苦苦掙扎,希望能得到一些幫助。 我目前在臨時表中有一個列表IP,我想計算該IP充當服務器的次數以及充當客戶端的次數。 無論我如何操縱此select語句,無論我用什么替換空值,我總是會收到相同的錯誤,告訴我ServerCount是無效的列。 這是select語句:

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'。

謝謝。

您需要在聯合的第一個查詢中定義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

子查詢中的第一個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

您的查詢無效:

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列名稱

當執行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

至少看起來要簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM