2016-12-23 10 views
0

私のテーブルは以下の通りです:t1(name、date、sold); t2(名前、日付、買った);'WHERE'句の 'FROM'で宣言されたテーブルのエイリアスの使い方は?

私のクエリは次のとおりです。

SELECT * 
FROM (SELECT * FROM t1 
     UNION ALL 
     SELECT * FROM t2) AS tRes 
WHERE 
    date < DATE_ADD(DATE_ADD((SELECT MAX(date) FROM tRes), INTERVAL -DAY((SELECT MAX(date) FROM tRes)) + 1 DAY), INTERVAL -2 MONTH); 

すなわち、私はtResの最大日付より2ヶ月ではない日付の行を受け取ろうとしています - 2007-12-03が組合の最大日付である場合、結果の日付は2007-10-01より小さくなければなりません。

「tRes does not exist」(1146)というエラーが表示されます。これは単純化されたバージョンのクエリです。実際、tRes宣言にはたくさんのコードがありますので、以下のselectの宣言をコピーすることはできません。 ここで何ができますか?私は 'WHERE'節に表示されているユニオンのエイリアスを宣言したいと思います。

+2

[MySQLのクエリの句がエラーを生成しますWHEREで列の別名を使用する]の可能複製(http://stackoverflow.com/questions/942571/using-column-:だから、1つの解決策は、ロジックを繰り返すことですalias-in-where-clause-of-mysql-query-produced-an-error) –

答えて

1

はい、正しいです。別名FROMで定義されている別のFROM句では使用できません。

SELECT * 
FROM (SELECT * FROM t1 
     UNION ALL 
     SELECT * FROM t2 
    ) tRes CROSS JOIN 
    (SELECT MAX(date) as maxdate 
     FROM (SELECT * FROM t1 
      UNION ALL 
      SELECT * FROM t2 
      ) tRes 
    ) tresmax 
WHERE date < DATE_ADD(DATE_ADD(tResmax.maxdate, INTERVAL - DAY(tResmax.maxdate + 1 DAY 
          ), INTERVAL -2 MONTH 
        ); 
関連する問題