0

PostgreSQL データベースのスキーマを作成/作成してからクエリを実行することは可能ですか?

SELECT email, username, city_population
FROM users, cities
WHERE email = 'user@example.com'

また、ユーザー テーブルと都市テーブルの間の接続は別の場所で定義されており、PostgreSQL はその情報を使用してテーブルを結合します。そのようなものはありますか?

編集:ビューなし

4

3 に答える 3

4

がありますがNATURAL JOIN、それを機能させるには、列に同じ名前を付ける必要があります。言い換えれば、これはうまくいきます:

CREATE TABLE cities (
  city_id SERIAL PRIMARY KEY,
  city_population INTEGER,
  ...
);

CREATE TABLE users (
  username VARCHAR PRIMARY KEY,
  city_id INTEGER REFERENCES cities,
  ...
);

SELECT email, username, city_population
FROM users
NATURAL JOIN cities
WHERE email = 'user@example.com';

Will のビュー ソリューションはより優れており、おそらくあなたが望むものに近いと思いますが、これはあなたの質問の文字に近いと思います。

于 2013-02-03T03:10:18.653 に答える
2

では、結合方法を定義せずに、結合テーブルからの結果が必要ですか?

答えはノーだ。明らかに、どうにかしてそれらを結合する必要があり、多くの可能な方法があるため、どのように結合するかを定義する必要があります

NATURAL JOINあなたが話していることの次善の策かもしれません。それについては@Danielの回答を参照してください。

標準 SQL のもう 1 つの構文上のショートカットは、USINGです。それを使用すると、テーブルを結合する列のリストを定義できます。列名は両側で一意である必要があります。

SELECT u.email, u.username, c.city_population
FROM   users  u 
JOIN   cities c USING (city_id)
WHERE  u.email = 'user@example.com'

また、あいまいな可能性があるクエリにテーブル修飾を追加しました。

于 2013-02-03T03:15:42.807 に答える
2

いいえ、NATURAL JOINDaniel の説明は SQL に近いものです。理由があります。多くの場合、同じドメイン内の列の等価性に基づいて結合したいと考えていますが、より複雑なものが必要な場合もあります。「この都市から 300 マイル以内の都市に住んでいるのは誰ですか?」、「このユーザーが住んでいる都市を除いて、このユーザーに最も近い 3 つの都市は?」、または「どの都市に住んでいますか?」他のユーザーはこのユーザーと同じ州に住んでいますか?」いくつかの仮定された結合基準に基づいて自動結合を行うと、そのような質問に答えるために明確なクエリを作成することが難しくなります。

とはいえ、探しているものを欲しがることは珍しくないので、Craig が言ったように、外部キー定義を使用してデフォルトのリンケージを提供する多くのツールがあります。

質問に基づいて、おそらくHTSQLに興味があるのではないかと思います。HTSQL は、自動リンクやその他の便利な機能を提供し、リレーショナル データベースと、人々が既に知っている他の形式との間のギャップを埋めるのに役立ちます。その開発は、国立科学財団を含む財団の助成金によって部分的に資金提供されています。(ドキュメントを読んだことと、カンファレンスで著者の 1 人と短い会話をしたこと以外に、私はこのプロジェクトとは何の関係もありません。)

于 2013-02-03T16:03:04.993 に答える