sql вложенный выбор неверного столбца - PullRequest
0 голосов
/ 15 октября 2010

Привет всем, Я немного боролся с утверждением select и надеялся получить помощь. В настоящее время у меня есть список IP-адресов во временной таблице, и я хочу подсчитать, сколько раз этот IP-адрес выступает в качестве сервера и сколько раз он выступает в качестве клиента. Независимо от того, как я манипулирую этим оператором выбора, я всегда получаю одну и ту же ошибку, сообщающую мне, что 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 Столбец 3 для столбца 't' не указан. Сообщение 207, уровень 16, состояние 1, строка 13 Неверное имя столбца 'ServerCount'. Сообщение 207, уровень 16, состояние 1, строка 1 Неверное имя столбца 'ServerCount'.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 15 октября 2010

Вам необходимо определить количество серверов в первом запросе объединения.Также ноль, вероятно, не имеет смысла .... Я бы использовал ноль вместо этого.

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
0 голосов
/ 15 октября 2010

При выполнении 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

Гораздо проще смотреть, по крайней мере.

0 голосов
/ 15 октября 2010

Ваш запрос недействителен:

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

0 голосов
/ 15 октября 2010

Первый SELECT в подзапросе должен определить все имена столбцов, поэтому вам нужно изменить:

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

до

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

Кроме того, я бы изменил 2-й SELECT в подзапросе, чтобы привести столбцы в том же порядке:

select IP as IPS, null AS ClientCount, Count(*) as ServerCount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...