タグ付けされた質問 「join」

SQL結合句は、2つ以上のテーブルまたはビューのレコードを結合します。

1
なぜこのLEFT JOINがLEFT JOIN LATERALよりもパフォーマンスがそれほど悪いのですか?
次の表があります(Sakilaデータベースから取得)。 film:film_idはpkeyです 俳優:actor_idはpkeyです film_actor:film_idとactor_idは、映画/俳優のfkeyです 特定の映画を選択しています。この映画では、すべての俳優がその映画に参加することも望んでいます。これには2つのクエリがあります。1つのクエリLEFT JOINと1 つのクエリですLEFT JOIN LATERAL。 select film.film_id, film.title, a.actors from film left join ( select film_actor.film_id, array_agg(first_name) as actors from actor inner join film_actor using(actor_id) group by film_actor.film_id ) as a on a.film_id = film.film_id where film.title = 'ACADEMY DINOSAUR' order by film.title; select film.film_id, film.title, …


3
SQL JOINまたはIN句を使用する必要がありますか?
最善のアプローチについて質問があります。データのサイズが可変であると考えられる場合、どのアプローチが最適かはわかりません。 次の3つの表を検討してください。 社員 EMPLOYEE_ID、EMP_NAME 事業 PROJECT_ID、PROJ_NAME EMP_PROJ(上記の2つのテーブルの多くに多数) EMPLOYEE_ID、PROJECT_ID 問題:EmployeeIDを指定すると、このEmployeeが関連付けられているすべてのプロジェクトのすべての従業員を見つけます。 私はこれを2つの方法で試しました。どちらのアプローチも、使用するデータのサイズに関係なく、数ミリ秒だけ異なります。 SELECT EMP_NAME FROM EMPLOYEE WHERE EMPLOYEE_ID IN ( SELECT EMPLOYEE_ID FROM EMP_PROJ WHERE PROJECT_ID IN ( SELECT PROJECT_ID FROM EMP_PROJ p, EMPLOYEE e WHERE p.EMPLOYEE_ID = E.EMPLOYEE_ID AND E.EMPLOYEE_ID = 123) 行く select c.EMP_NAME FROM (SELECT PROJECT_ID FROM EMP_PROJ WHERE …
13 postgresql  join 

4
大きなクエリを複数の小さなクエリに分割する方が良いでしょうか?
必要な結果を生成するために、いくつかのテーブルをサブ選択ステートメントと一緒に結合する非常に大きなクエリを必要とする状況があります。 私の質問は、複数の小さなクエリを使用することを検討し、複数の呼び出しでDBにクエリを実行して論理演算をアプリケーション層に持ち込む必要がありますか? たとえば、次のクエリを検討してください。 SELECT * FROM `users` WHERE `user_id` IN (SELECT f2.`friend_user_id` FROM `friends` AS f1 INNER JOIN `friends` AS f2 ON f1.`friend_user_id` = f2.`user_id` WHERE f2.`is_page` = 0 AND f1.`user_id` = "%1$d" AND f2.`friend_user_id` != "%1$d" AND f2.`friend_user_id` NOT IN (SELECT `friend_user_id` FROM `friends` WHERE `user_id` = "%1$d")) AND …

1
PostgreSQL 9.6の望ましくないネストループとハッシュ結合
PostgreSQL 9.6のクエリ計画に問題があります。私のクエリは次のようになります: SET role plain_user; SELECT properties.* FROM properties JOIN entries_properties ON properties.id = entries_properties.property_id JOIN structures ON structures.id = entries_properties.entry_id WHERE structures."STRUKTURBERICHT" != '' AND properties."COMPOSITION" LIKE 'Mo%' AND ( properties."NAME" LIKE '%VASP-ase-preopt%' OR properties."CALCULATOR_ID" IN (7,22,25) ) AND properties."TYPE_ID" IN (6) 上記で使用したテーブルに対して行レベルのセキュリティを有効にしています。 を使用するset enable_nestloop = Trueと、クエリプランナーはネストループを実行し、合計実行時間は約37秒になります。https://explain.depesz.com/s/59BR をset enable_nestloop …

2
SQL Serverの別のテーブルの値を使用してテーブルを更新する
データベースに2つのテーブルがあります。 表1 ------------------------------------------------------------------------- | name | family | phone | email | gender | phone2 | address | birthdate | ------------------------------------------------------------------------- テーブル#2 ----------------------------------------- | gender | address | phone | birthdate | ----------------------------------------- テーブル#1の列ではaddressとphone2は空で、列の性別と生年月日の値はテーブル#2と同じです。 どのように私はテーブル#2及び更新からデータを読み取ることができますアドレスとphone2のテーブル#2からの値を持つテーブル#1でのアドレスと電話するとき、列を性別と誕生日が各行に同じですか? 例:これは表#1の一部のデータです ------------------------------------------------------------------------- | name | family | phone | email | gender | phone2 | …

2
[FROM x、y]はPostgresで何を意味しますか?
Postgresを始めたばかりです。このドキュメントを読んで、私はこのクエリに出会いました: SELECT title, ts_rank_cd(textsearch, query) AS rank FROM apod, to_tsquery('neutrino|(dark & matter)') query WHERE query @@ textsearch ORDER BY rank DESC LIMIT 10; これを除く、このクエリのすべてを理解できます。FROM apod, ...。 これは,どういう意味ですか?私は参加するのに慣れていますが、複数ではありませんFROM、コンマで区切られたステートメント。 私は、ネットを検索しました。それを見て考えた後、クエリと呼ばれる変数を宣言しているので、複数回使用できるように思えます。しかし、これが本当なら、それは何と関係がありFROMますか?
12 postgresql  join 

4
結合の最大値を選択するクエリ
ユーザーのテーブルがあります: |Username|UserType|Points| |John |A |250 | |Mary |A |150 | |Anna |B |600 | とレベル |UserType|MinPoints|Level | |A |100 |Bronze | |A |200 |Silver | |A |300 |Gold | |B |500 |Bronze | そして、各ユーザーのレベルを取得するためのクエリを探しています。以下の線に沿ったもの: SELECT * FROM Users U INNER JOIN ( SELECT TOP 1 Level, U.UserName FROM Levels L …

1
2つのイベントテーブルを1つのタイムラインにまとめる
2つのテーブルがある場合: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); 私はのための戻り値というクエリを書きたいts、fooとbarその直近の値の統一見解を表しています。つまり、foo含まれている場合: ts | foo -------- 1 | A 7 | B そしてbar含まれています: ts | bar -------- 3 | C 5 | D 9 | E 私は返すクエリが必要です: ts | foo | bar -------------- 1 | A …

1
最初に1つのインデックスを検索し、次に別のインデックスを検索するようにクエリを最適化する方法
衛星データからの2つの地球測定値セットがあり、それぞれに時間フィールド(平均ユリウス日付のmjd)と地理的位置(GeoPoint、空間)があり、2つのセット間の一致が時間のしきい値に一致するように探しています3時間(または.125日)およびそれらの距離は互いに200 km以内です。 テーブルと空間テーブルの両方のmjdフィールドにインデックスを作成しました。 時間の制約に参加するだけで、データベースは8秒で100,000回の一致を計算し、その時間内のすべての100,000回の一致の距離を計算します。クエリは次のようになります。 select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) ) 実行された計画は次のとおりです。 並べ替えると、9つの距離が200km未満であったため、一致します。問題は、距離制約を追加して代わりにこれを実行すると、 select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on …


3
シリーズから各日付をカバーする日付の範囲の数を数える最速の方法
次のようなテーブル(PostgreSQL 9.4)があります。 CREATE TABLE dates_ranges (kind int, start_date date, end_date date); INSERT INTO dates_ranges VALUES (1, '2018-01-01', '2018-01-31'), (1, '2018-01-01', '2018-01-05'), (1, '2018-01-03', '2018-01-06'), (2, '2018-01-01', '2018-01-01'), (2, '2018-01-01', '2018-01-02'), (3, '2018-01-02', '2018-01-08'), (3, '2018-01-05', '2018-01-10'); 次に、指定された日付と種類dates_rangesごとに、各日付の行数を計算します。ゼロはおそらく省略できます。 望ましい結果: +-------+------------+----+ | kind | as_of_date | n | +-------+------------+----+ | 1 | …

4
カウントがゼロのグループを取得するにはどうすればよいですか?
SQLサーバーデータベースのデータからグラフを作成しようとします。カウントがゼロであっても、このストリートに住んでいるユーザーのカウントを含むすべてのストリートを取得します。 このために私はこのクエリを試しました: Create table Streets( ID int IDENTITY primary key, Name varchar(100) ); create table users( ID int IDENTITY primary key, Username varchar(100), StreetID int references Streets(id) ); insert into streets values ('1st street'), ('2nd street'), ('3rd street'), ('4th street'), ('5th street'); insert into users values ('Pol', 1), ('Doortje', 1), …

2
1つのテーブルに存在しない行を含む行を表示するSQL結合クエリ
私は従業員の時間記録についていくつかのレポートを作成しようとしています。 この質問に特化した2つの表があります。従業員はMembersテーブルに一覧表示され、毎日、彼らが実行した作業の時間エントリを入力し、Time_Entryテーブルに保存されます。 SQL Fiddleでの設定例:http ://sqlfiddle.com/#!3/ e3806/7 私は行くよ最終結果は番組表であるALLMembers列リストで、その後は他の列に照会した日のために彼らの合計時間が表示されます。 問題はTime_Entry、特定のメンバーのテーブルに行がない場合、そのメンバーの行があることです。私はいくつかの異なる結合タイプ(左、右、内部、外部、完全外部など)を試しましたが、(SQL Fiddleの最後の例に基づいて)希望どおりの結果が得られないようです。 /*** Desired End Result ***/ Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL ADavis | 0 | 11-10-2013 | 0 | 0 BTronton | 0 | 11-10-2013 | 0 | 0 CJones | 0 | 11-10-2013 | 0 | 0 …

2
PostgresのJOIN条件とWHERE条件
Postgres初心者はこちら。 このクエリが最適化されているかどうか疑問に思っていますか?100%必要な値だけを結合し、すべての動的条件をWHERE句に残そうとしました。下記参照。 SELECT * FROM myapp_employees JOIN myapp_users ON myapp_users.user_id=myapp_employees.user_id JOIN myapp_contacts_assoc ON myapp_contacts_assoc.user_id=myapp_users.user_id JOIN myapp_contacts ON myapp_contacts.contact_id=myapp_contacts_assoc.contact_id WHERE myapp_contacts.value='test@gmail.com' AND myapp_contacts.type=(1)::INT2 AND myapp_contacts.is_primary=(1)::INT2 AND myapp_contacts.expired_at IS NULL AND myapp_employees.status=(1)::INT2 AND myapp_users.status=(1)::INT2 LIMIT 1; 注:コンテキストについては、このプロシージャはユーザーが従業員でもあるかどうかを確認しています(昇格された特権/別のユーザータイプ)。 とにかく、これは正しい方法ですか?たとえば、JOIN ONには、expired_at IS NULLのチェックなど、より多くのステートメントを含める必要がありますか?なぜ、またはなぜこれが意味をなさないのですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.