2016-07-05 12 views
1

のような何か実行しようとしました:単一ステートメントのSQLクエリで名前付き定数/パラメータを定義する方法はありますか?

WITH 
dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT * FROM my_table WHERE start_date >= dates.start AND end_date <= dates.end 

をしかし、エラーメッセージ「関係 『日付』が存在しない」(のVertica中)を得ました。定数/パラメータを定義する適切な方法はありますか?実際の例では、クエリには定義された時間範囲に渡って複数の選択が含まれているため、値の定数/パラメータを1つの場所に保持してネストされたサブクエリで再利用できるようにします。

可能であれば、別の行が必要なDECLARE/SET-like文を控えてください。

+1

なぜVerticaとMySQLの両方にタグが付けられますか?これらは非常に異なるデータベースです。 MySQLのタグを削除しました。なぜなら、あなたの質問は 'WITH'が動作することを示唆しており、MySQLではサポートされていないからです。 –

+0

私はMySQLが 'WITH'をサポートしていないことを知らなかったし、StackOverflowの提案のためにMySQLを追加しました。訂正してくれてありがとう、@ GordonLinoff – BreakPhreak

+0

どのクライアントを使って接続していますか?これらのvsqlスクリプトはありますか? – woot

答えて

1

FROM句にはdatesが必要です。

WITH dates as (SELECT '2015-01-01' as start, '2016-01-01' as end) 
SELECT t.* 
FROM my_table t JOIN 
    dates d 
    ON t.start_date >= d.start AND t.end_date <= d.end; 

注:CROSS JOINでこれを行うこともできます。私はしばしば、クエリを記述します。

WITH params as (
    SELECT '2015-01-01' as start, '2016-01-01' as end 
    ) 
SELECT t.* 
FROM params CROSS JOIN 
    my_table t 
WHERE t.start_date >= params.start AND t.end_date <= params.end; 
+0

定数を使用すると、「JOIN」の価格になります。サブクエリでたくさんの選択肢があることを考えれば、コードをさらに読みにくくすることができます:( – BreakPhreak

2

私はまだ(私はそれがクエリプランに大きな影響を与えている疑い)を挙げる@GordonLinoff何だろうが、場合にあなたが本当にするか、私は意志の機能のようにしたくありません最後に表示...

あなたはvsqlを使用するつもりだと述べました。そこに変数を置くことができます。

\set start ''`date "+%Y-%m-%d %H:%M:%S"`'' 

それとも、あなたのSQL文で変数として使用できる変数に任意のコマンドの結果をエコー:あなたも同じようなことを行うことができますので、私は一種の素敵な推測です

\set start '2015-01-01' 
\set end '2016-01-01' 
SELECT * 
FROM my_table 
WHERE start_date >= :start 
AND end_date <= :end; 

。この変数はかなりリテラルなので、句読点や引用符などを入れる必要があることに注意してください。単なる値ではなく、テンプレートのようなものです。

関連する問題