1

エイリアスがin_Degreeとout_degreeである、構文的に正しくない次のクエリがあります。

insert into userData
select user_name, 
      (select COUNT(*) from tweets where rt_user_name = u.USER_NAME)in_degree,
      (select COUNT(*) from tweets where source_user_name = u.user_name)out_degree, 
      in_degree + out_degree(freq)
   from users u

クエリの問題は、選択リストの4番目の項目がfreqとしてエイリアスされていることです。4番目のアイテムの値をin_degree+out_degreeにします。強引な非常に遅い解決策は、両方のサブクエリをコピーして貼り付け、それらを追加することです。

  1. これをin_degree+out_degreeのように速く簡単にするにはどうすればよいですか?
4

4 に答える 4

2

サブクエリを使用できます。

 insert into userData
 select user_name,
   in_degree,
   out_degree,
   in_degree + out_degree
 from
 (
   select user_name, 
    (select COUNT(*) from tweets where rt_user_name = u.USER_NAME)in_degree,
    (select COUNT(*) from tweets where source_user_name = u.user_name)out_degree
   from users u
 ) src

または、次を使用できる場合があります。

insert into userData
select user_name,
  count(distinct in_t.*) in_degree,
  count(distinct out_t.*) out_degree,
  count(distinct in_t.*) + count(distinct out_t.*)
from users u
left join tweets in_t
  on u.USER_NAME = in_t.rt_user_name
left join tweets out_t
  on u.USER_NAME = out_t.source_user_name
 group by u.user_name
于 2012-12-27T22:25:04.897 に答える
2

ご存知のように、HAVING句またはORDER BY句を除いて、その選択リストで指定されたエイリアスを参照することはできません。

1つのオプションは、クエリを「インラインビュー」として使用し、その周りにラッパークエリを作成することです。

  • クエリの選択リストから4番目の(無効な)式を削除します。
  • クエリを一連の親にラップします
  • エイリアス(例)でクロージングパレンをフォローします。
  • テーブルのようにインラインビューを参照して、その周りにクエリを記述します
  • 外部クエリの選択リストは、インラインビューで定義された「エイリアス」を参照できます。

ただし、これを「高速」にしたい場合は、(オプションとして)まったく異なる方法を検討することをお勧めします。相関サブクエリを使用して個々のユーザーのカウントを取得するのではなく、すべてのユーザーのカウントを取得してから、LEFTJOIN演算子を使用できます。

SELECT u.user_name
     , IFNULL(i.cnt,0) AS in_degree
     , IFNULL(o.cnt,0) AS out_degree
     , IFNULL(i.cnt,0)+IFNULL(o.cnt,0) AS freq
  FROM users u
  LEFT
  JOIN (SELECT rt_user_name, COUNT(*) AS cnt FROM tweets 
        GROUP BY rt_user_name) i
    ON i.rt_user_name = u.user_name
  LEFT
  JOIN (SELECT source_user_name, COUNT(*) AS cnt FROM tweets 
        GROUP BY source_user_name) o
    ON o.source_user_name = u.user_name
于 2012-12-27T22:39:52.217 に答える
0

これは機能するはずです:

insert into userData
  SELECT T.user_name,
       T.in_degree,
       T.out_degree,
       (T.in_degree + T.out_degree) as freq
   FROM (SELECT user_name, 
          (select COUNT(*) from tweets where rt_user_name = u.USER_NAME) as in_degree,
          (select COUNT(*) from tweets where source_user_name = u.user_name) as out_degree      
           FROM users u) T
于 2012-12-27T22:25:16.433 に答える
0

速い方法で、私は次のようなことをします:

insert into userData
select 
    TMP.user_name,
    TMP.in_degree,
    TMP.out_degree,
    (TMP.in_degree + TMP.out_degree) degreeSum
from(
    select user_name, 
        (select COUNT(*) from tweets where rt_user_name = u.USER_NAME)in_degree,
        (select COUNT(*) from tweets where source_user_name = u.user_name)out_degree
    from users u
) TMP
于 2012-12-27T22:26:04.110 に答える