0

こんにちは、次の自己再帰クロス結合の代替構文があるかどうかを調べています。目的は、テーブルの一種の行フィラーです。日付には、すべての cdn のエントリが必要です。私はMySQLを使用しています

select 
  d.labelDate, 
  n.cdn,
  networks.sites
from (
  select 
    distinct labelDate 
  from 
    cdn_trend
) as d
cross join (
  select 
    distinct cdn 
  from cdn_trend
) as n
left join cdn_trend as networks 
  on  networks.labelDate = d.labelDate
  and networks.cdn = n.cdn    
order by 
  labelDate, 
  cdn

単純なエイリアスを使用してクロス結合を再キャストしようとしましたが、結合で列エラーが発生します。そうすることは可能ですか、代わりにビューの使用を検討する必要がありますか?

クロス結合は単純に 2 つのテーブルのデカルト積を返す必要があるため、結合せずに単純に両方を選択するのと同じである必要があります。ただし、次の場合、「on 句の不明な列 d.labelDate」例外が発生します。

select distinct d.labelDate, n.cdn, networks.sites
from 
cdn_trend as d,
cdn_trend as n
left join cdn_trend as networks ON
(n.labelDate = networks.labelDate
and d.cdn = networks.cdn)
order by labelDate, cdn

Error Code: 1054. Unknown column 'd.cdn' in 'on clause'

との長さdn比較的小さいため、クエリのサイズは十分に高速です。

4

3 に答える 3

0

コメントと追加情報を読むには、y と x と値を持つピボットlableDatecdn必要sitesです。cdnsites

SELECT
    labelDate,
    SUM(IF(cdn = 'a',sites,0)) as cdn_a,
    SUM(IF(cdn = 'b',sites,0)) as cdn_b,
    SUM(IF(cdn = 'c',sites,0)) as cdn_c
FROM 
    cdn_trend
GROUP BY
    labelDate

そして、出力は次のようになります(私はあなたからのサンプルデータを使用しました):

labelDate   cdn_a   cdn_b   cdn_c
2013-04     NULL    5       4
2013-05     6       NULL    NULL
....
于 2013-05-16T07:18:34.340 に答える
0

当初の意図に近いと思います...すべての日付について、すべてのネットワークノードステータスの結果が必要です。結合条件なしでWHERE句に複数のテーブルをリストすると、デフォルトでデカルトが作成されます...それから、詳細テーブルに結合します...

select 
      d.labelDate, 
      n.cdn,
      networks.sites
   from 
      ( select d.LabelDate, n.cdn
           from 
              ( select distinct labelDate 
                   from cdn_trend ) as d,
              ( select distinct cdn 
                   from cdn_trend ) as n ) as CrossResults
         LEFT JOIN cdn_trend as networks 
         on  CrossResults.labelDate = networks.labelDate
         and CrossResults.cdn = networks.cdn
   order by 
      networks.labelDate, 
      networks.cdn
于 2013-05-15T17:36:41.007 に答える