![](/img/trans.png)
[英]SQL Server Management Studio insert into nested select, invalid column
[英]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.