2012-03-30 5 views
3

を複製せずに参加する:SQL - このように、私は数百の列を持つ2つのテーブルを結合したいキー

select * from a, b where a.key = b.key 

問題は、私が命名しないと

Key | Key | Row1 | etc... 

を持つテーブルを取得するということですすべての列を明示的に( "select a.key, row1, ... from a, b where a.key = b.key")、私はそれが1つだけのキーを返すようにクエリを制限する方法はありますか?

+4

いいえ、あなたが望む列を指定する必要があります。もし 'b'のデータだけを望むなら、' a.key、b。* 'を実行することができます。 –

+0

@rs。ああ、それはそれを処理します。 Hiro2kの答えがあなたの最初の文と矛盾するようです。しかし、あなたのソリューションは私の目的にとっては最高のもののように思えます。ありがとうございました! – canisrufus

答えて

6
select * from a INNER JOIN b USING (key) 

使用した声明は、あなたの結果に一度に表示するための鍵になります。

+0

ありがとう、これは私がそれを尋ねたように問題を解決するようです。私は私のキーが一致しない別の問題があります:私はキーのいずれかの部分文字列を取る必要があります。部分文字列(key1)= key2を許可する構文はありますか? – canisrufus

+0

これは悪いデザインの兆候です。あなたのテーブルのキーは100%一致する必要があります。あなたがそれをしたければ、USING節ではできません。 ON句を使用するように変更する必要がありますが、複製が再び表示されます。 – Hiro2k

+1

@ Hiro2k DBサークルで非常に強力な論争の問題です。個人的には、「USING」は結合条件として、壊れやすいSQLにつながる恐ろしい間違いであると思います。実際の修正は、実動コードで 'SELECT *'を使用することではなく、明示的に列を明示的にリストすることです。これにより、列の追加/並べ替えを防ぐことができ、ほとんどのDBのパーサーが便利なエラーメッセージを表示しやすくなります。 –

3

はたぶんNATURAL JOINはあなたのためのソリューションです:そこより重複キー名をしていて、そしてナチュラル・ジョイン、結果には、このようなキーの両方が必要な場合は

SELECT * FROM a NATURAL JOIN b; 

しかし、あなたのために良いではありません。

+3

+1私に何か新しいことを教えるため。ウィキペディアによると、「ほとんどの専門家は、NATOAL JOINは危険であり、したがってその使用を強く妨げていることに同意している」おそらく、 "Using"ステートメントと一緒に行くつもりです。 – canisrufus

+0

最初は質問を誤解しました。重複したキー名をすべて削除したいと思っていました。そして、私は同意します、自然な結合は危険で、使用すべきではありません。 –

1

*の代わりにフィールドの名前を特に指定すると、重複するキーがなくなり、クエリが高速になります(聞いたことがあるので)。

select key, field1, field2, field3 from a, b where a.key = b.key 
+0

数百の列であるという事実は、そのような魅力的ではないものです。 – canisrufus

+0

実際には列の小さなサブセットだけが必要な場合を除いて、私は認識している正常なDBではクエリーを速くするべきではありません。それでも、省略されたカラムが本当に大きい(つまり、データをクライアントに転送するコストを削減する)場合、またはPostgreSQLの 'TOAST'のようなメカニズムを使用してメインタプルからライン外に格納される場合にのみ役立ちます大きな列のフェッチは完全にスキップできます。 –

+2

@canisrufus "数百の列"があなたの問題の一部になっているかもしれませんが、私はきれいでかわいいデザインが現実世界の性能要求に常に合致するとは限らないことを理解しています。状況に応じて、PostgreSQLの 'hstore'や* shudder * EAVデザインのようなキー/値の拡張タイプを考えてみてください。 'SELECT *'を使うと、最初に列を追加しなければならないときや、悪い場合には中間のどこかに挿入することを嫌う傾向があります。 –