2

having句のサブセレクトからネットワーク列を参照するにはどうすればよいですか?

select distinct c.id, c.name,
(
select count(cm.id) cnt
from
company_mapping cm
where
cm.company_id_source = c.id
or
cm.company_id_target = c.id
) network
from company c
where
c.name like 'foobar%'
group by c.id, c.name
having network > 1

ORA-00904: "NETWORK": 識別子が無効です。最後の行を省略しても期待どおりに機能しますが、ネットワークが 1 を超える行にのみ関心があります。

4

4 に答える 4

9

、または で定義さselectれているフィールドにはアクセスできません。group byhavingwhere

SQL 演算子の順序は次のとおりです。

1.FROM clause
2.WHERE clause
3.GROUP BY clause
4.HAVING clause
5.SELECT clause
6.ORDER BY clause 

そのため、 in は使用できますが、 in の前に来る演算子は使用できnetworkませorder byselect

于 2013-05-15T08:42:33.127 に答える
3

Ronnis は正しい道を進んでいますが、クエリは実際にはもっと単純なはずです。select 内で select を避けるようにしてください。これは 99% の確率でパフォーマンスを低下させるからです。

select c.id
,      c.name
,      count(*) network
from   company c
join   company_mapping cm on c.id in (cm.company_id_source, cm.company_id_target)
where  c.name like 'foobar%'
group by c.id, c.name
having count(*) > 1
于 2013-05-15T09:25:31.510 に答える
3

このようなことをしようとしていますか?

select c.id
      ,c.name
      ,count(*) 
      ,count(s.company_id_source) as num_sources
      ,count(t.company_id_target) as num_targets
  from company              c
  left join company_mapping s on(s.company_id_source = c.id)
  left join company_mapping t on(t.company_id_target = c.id)
 where c.name like 'foobar%'  
 group 
    by c.id
      ,c.name
having count(s.company_id_source) > 1
    or count(t.company_id_target) > 1;

編集:コメントに応じて、以下の新しいクエリ。クエリが返されるようになりました: テーブル company_mapping に関連付けられた行があるかどうかに関係なく、「Foobar」に一致するすべての会社。

  • num_sources: 会社がソースである company_mapping 内の行の数。
  • num_targets: 会社がターゲットである company_mapping 内の行の数。
  • num_mappings: company_mapping 内の「接続」の数 (ソースまたはターゲットのいずれか)

.

select c.id
      ,c.name
      ,count(s.company_id_source) + count(t.company_id_target)   as num_mappings
      ,count(s.company_id_source) as num_sources
      ,count(t.company_id_target) as num_targets
  from company              c
  left join company_mapping s on(s.company_id_source = c.id)
  left join company_mapping t on(t.company_id_target = c.id)
 where c.name like 'foobar%'  
 group 
    by c.id
      ,c.name;
于 2013-05-15T09:17:10.887 に答える