如何正确编写此SQL语句?

如何正确编写此SQL语句?,sql,join,informix,Sql,Join,Informix,如标题中所述:如何正确编写此SQL语句 select sl.switch_ip, sl.switch_name, count(m.switch_ip) as macentries, (select arpentries from (select sl1.switch_ip, sl1.switch_name, count(ar.switch_ip) as arpentries from my_switchlist sl1

如标题中所述:如何正确编写此SQL语句

   select 
    sl.switch_ip,
    sl.switch_name, 
    count(m.switch_ip) as macentries,
    (select arpentries from (select sl1.switch_ip, sl1.switch_name, count(ar.switch_ip) as arpentries 
        from my_switchlist sl1 
        left Join my_arptable ar on ar.switch_ip = sl1.switch_ip
        group by sl1.switch_ip,sl1.switch_name 
        order by sl1.switch_ip))
    from my_switchlist sl 
        left Join my_mactable m on m.switch_ip = sl.switch_ip
    group by sl.switch_ip,sl.switch_name 
    order by sl.switch_ip
如果单独执行select和sub select,则可以正常工作。 但当我把它们放在一起时,我得到了以下错误:

Error: A subquery has returned not exactly one row.
SQLState: 21000
ErrorCode: -284
Position: 470

在您的my_switchlist、my_arptable join中,可能有多个sl1.switch_ip、sl1.switch_名称组

select arpentries from (select sl1.switch_ip, sl1.switch_name, count(ar.switch_ip) as arpentries 
        from my_switchlist sl1 
        left Join my_arptable ar on ar.switch_ip = sl1.switch_ip
        group by sl1.switch_ip,sl1.switch_name 
        order by sl1.switch_ip)

上述查询不应返回多个结果,以便在外部查询中使用其结果。因此,可能存在多个sl1.switch\u ip、sl1.switch\u name组。

看起来您需要两个“计数”聚合,这应该可以通过以下方式实现:

select
   macquery.switch_ip,
   macquery.switch_name,
   macquery.macentries,
   arpquery.arpentries
from
(
   select 
      sl.switch_ip as switch_ip,
      sl.switch_name as switch_name,  
      count(m.switch_ip) as macentries
   from my_switchlist sl 
   left outer join my_mactable m
   on m.switch_ip = sl.switch_ip
   group by
      sl.switch_ip,
      sl.switch_name 
) macquery

join

(
   select
      sl1.switch_ip as switch_ip,
      sl1.switch_name as switch_name,
      count(ar.switch_ip) as arpentries 
   from my_switchlist sl1 
   left outer join my_arptable ar
   on ar.switch_ip = sl1.switch_ip
   group by
      sl1.switch_ip,
      sl1.switch_name 
) arpquery

on  (macquery.switch_ip =  arpquery.switch_ip
    and  macquery.switch_name =  arpquery.switch_name)

很简单,您的子选择返回多行,并且由于您尝试将它们合并到一个select语句中,因此假设子查询只返回一行。尝试将两个select语句连接在一起。如何可以有多个列?正如我所说:如果单独运行,查询运行良好-返回一列如果内部查询返回多个结果,则不能在聚合查询中使用其结果。我明白了。哦,我明白了。我并没有实际测试这个,所以可能有一些东西潜入-语法错误到底是什么?连接如何通过列switch\u ip、switch\u name工作,还是在行号上工作?错误:发生了语法错误。SQLState:42000错误代码:-201位置:681因此,这里的原则是每个子查询返回一个表,该表有3列:第一列为“switch\u ip”、“switch\u name”和“count”“macentries”,第二列为“arpcentries”。最外层的查询和联接只是利用此功能将“switch\u ip”和“switch\u name”的“键”上的两个“表”联接在一起