問題タブ [join]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - データベース結合はいつ、なぜコストがかかるのですか?
私はデータベースについていくつかの調査を行っており、リレーショナル DB のいくつかの制限を調べています。
大きなテーブルの結合は非常にコストがかかると思いますが、その理由は完全にはわかりません。結合操作を実行するために DBMS は何をする必要がありますか?ボトルネックはどこですか?
非正規化は、この費用を克服するためにどのように役立つでしょうか? 他の最適化手法 (インデックス作成など) はどのように役立ちますか?
個人体験も大歓迎!リソースへのリンクを投稿する場合は、ウィキペディアを避けてください。私はすでにそれを見つける場所を知っています。
これに関連して、BigTable や SimpleDB などのクラウド サービス データベースで使用される非正規化アプローチについて疑問に思っています。この質問を参照してください。
.net - サブテーブルのLINQ外部結合を行う方法は?
このタイプの設定のデータ テーブルがあります。
表 A
表 B
表 C
LINQ を使用して、A の特定の ID に対して、テーブル C にない B のリストを取得するクエリを作成したいと考えています。
したがって、AID が 1 の場合、BID は 20 と 30 が必要です。
AID 3 の場合、BID 10 が必要です
AID が 2 の場合、何も返されませんでした。
私はSQLが
LINQ に相当するものは何ですか?
それに応じて、A、B、および C のテーブルに一致するオブジェクトがあると仮定してください。
sql - 重複するエントリを検索するSQL(グループ内)
重複するエントリを検索するSQL(グループ内)
私には小さな問題があり、データベース(Oracle)自体へのアクセスが制限されているため、それを修正するための最良の方法がわかりません。テーブル「EVENT」には約16万のエントリがあり、各EVENTにはGROUPIDがあり、通常のエントリには同じGROUPIDを持つ正確に5つの行があります。バグが原因で、現在、いくつかの重複エントリが取得されています(重複しているため、5行ではなく10行で、EVENTIDが異なります。これは変更される可能性があるため、<> 5です)。これらのグループのすべてのエントリをフィルタリングする必要があります。
データベースへのアクセスが制限されているため、一時テーブルを使用することも、GROUPID列にインデックスを追加して高速化することもできません。
このクエリでGROUPIDを取得できますが、必要なデータを取得するには2番目のクエリが必要になります
1つの解決策は、副選択です。
GROUPIDと160kエントリのインデックスがないと、これには非常に時間がかかります。これを処理できる結合について考えてみましたが、これまでのところ適切な解決策を見つけることができません。
誰かがこれに対する良い解決策を見つけることができるかもしれませんか?
小さな編集:ここでは100%重複していません。これは、各エントリに一意のIDがあり、GROUPIDも一意ではないためです(そのため、「group by」を使用する必要があります)。それ :)
データに関する小さな例(削除したくないので、見つけてください)
EVENTID | GROUPID | TYPEID
123456 123 12
123457 123 145
123458 123 2612
123459 123 41
123460 123 238
234567 123 12
234568 123 145
234569 123 2612
234570 123 41
234571 123 238
タイムスタンプなど、さらにいくつかの列がありますが、すでにわかるように、EVENTIDを除いてすべてが同じです。
テスト、バグの発見、再発の有無の確認のために、より頻繁に実行します。
sql - Oracleの結合(左外側、右など:S)
「お気に入りのプログラミング漫画」が何であるかを知る以外に、stackoverflowが役立つことはわかっていました:P
これは、 Bill Karwinによって受け入れられた回答です。
助けてくれてありがとう(私はあなたに二重投票したい)
私のクエリは次のようになりました(これが本当のクエリです)
あとは、人間が読めるレポートを作成するために、他のテーブルと結合する必要があります。
元の投稿
こんにちは。
6時間くらい悩んでいます。DBクエリを使用するようになりました(私の長年の宿敵)
次のようないくつかのフィールドを持つデータテーブルがあります。
チケットの履歴を追跡するために使用されます
識別子: ( NAF0000001 ) のような顧客 ID です。
activity : チケットがどこにあるかの fk です (新規、進行中、拒否、クローズなど)
参加者: その時点でチケットに参加している人の fk です。
closedate : そのアクティビティが終了した日付です。
編集:終了日ではなく「完了日」と言うべきでした。これはアクティビティが完了した日付であり、チケットがクローズされたときは必要ありません。
たとえば、典型的な履歴は次のようになります。
参加者 1=ジョン、2=スコット、3=マイク、4=ロブ
および活動 1=新規、2=進行中、3=承認待ち、4=終了
など。そして、他の何十もの無関係な情報。
さて、私の問題は次のとおりです。
チケットがいつオープンされ、いつクローズされたかを知ることができるクエリを作成することができました
それはこのようなものです:
しかし、どのチケットがクローズされておらず、誰が出席しているのかわかりません。
これまでのところ、次のようなものがあります。
つまり、開始した ( new = 1 ) が閉じていない ( closed = 4 ) すべての人を教えてください。
しかし、ここでの大きな問題は、チケットを開いた参加者を出力することですが、それに参加している参加者が必要です。そこで、「進行中」のアクティビティをクエリに追加します。
しかし、「新規」にあるすべての行が「進行中」であるとは限らず、そのクエリではそれらすべてを削除します。
必要なのは、すべての「進行中」の参加者を表示することです。チケットが「進行中」でない場合は、空として表示されます。
のようなもの
この場合
NA002、NA003、NA004は「新規」のため、参加者は表示されません
その間
NA005 と NA006 は "inprgress (act = 2 )" であり、rob (参加者 4 ) が参加しています。
だから、左外部結合と呼ばれるものがあったことを覚えていますが、私はそれを決して理解していません。私が知りたいのは、「進行中」および「新規」であり、閉じられていない識別子を取得する方法です。
少し休むと頭がすっきりするのではないでしょうか。誰かがそれを行う方法を知っていれば、私はそれを感謝します。
ところで、私は試しました:
しかし、前と同じ結果が得られます(「新しい」レコードのみをドロップします)
mysql - 左結合は内部結合よりも優れていますか?
作業中のアプリケーションでいくつかのクエリのプロファイリングを行っていたところ、必要以上の行を取得しているクエリに出くわし、アプリケーション コードで結果セットが削除されていました。
LEFT JOIN を INNER JOIN に変更すると、結果セットが必要なものだけにトリミングされ、おそらくパフォーマンスも向上します (選択される行が少ないため)。実際には、LEFT JOIN を使用したクエリは、INNER JOIN を使用したクエリよりもパフォーマンスが高く、完了までの時間は半分でした。
LEFT JOIN: (合計 127 行、クエリにかかった時間は 0.0011 秒)
INNER JOIN: (合計 10 行、クエリにかかった時間は 0.0024 秒)
(クエリを複数回実行しましたが、それらは平均です)。
両方で EXPLAIN を実行しても、パフォーマンスの違いを説明するものは何も明らかになりません。
内部結合の場合:
左結合の場合:
そしてクエリ自体:
(私が話している節は、'users' テーブルの最後の INNER JOIN です)
違いがある場合、クエリは MySQL 5.1 データベースで実行されます。
この場合、LEFT JOIN されたクエリが INNER JOIN されたクエリよりも優れている理由について、誰もが手がかりを持っていますか?
更新:使用している小さなテーブルがINNER JOINをより複雑にしているというTomalakの提案により、いくつかのモックデータを使用してテストデータベースを作成しました。「ユーザー」テーブルは 5000 行で、連絡先テーブルは最大 500,000 行です。結果は同じです (また、タイミングが変更されていないことは、現在テーブルがはるかに大きいことを考えると驚くべきことです)。
また、連絡先テーブルで ANALYZE と OPTIMIZE を実行しました。目に見える違いはありませんでした。
sql - MySQL LEFT JOIN SELECT はすべての左側のレコードを選択していませんか?
MySQL SELECT
を含むクエリから奇妙な結果が得られます。私の理解が間違っているのか、それとも本当に奇妙な動作が見られているのかLEFT JOIN
わかりません。LEFT JOIN
多対 1 の関係を持つ 2 つのテーブルがtable 1
ありますtable 2
。テーブル 1 のすべてのレコードを、テーブル 2 の関連レコードの数をカウントする列で選択したいと考えています。私が理解しているように、常にステートメントLEFT JOIN
の側にあるすべてのレコードを返す必要があります。LEFT
問題を示すテストデータベースは次のとおりです。
Dates テーブルには 3 つのレコードと Slots 1 があり、そのレコードは Dates の 3 番目のレコードを指しています。
次のクエリを実行すると..
.. 3 行のテーブルが表示されることを期待しています。2 行はカウント 0 で、1 行はカウント 1 です。しかし、実際に表示されるのは次のとおりです。
ゼロ カウントの最初のレコードが表示されますが、ゼロ カウントの後のレコードは無視されます。
私は何か間違ったことをしていますか、それとも LEFT JOIN が何をすべきか理解していませんか?
php - JOINをサポートするPHP用のSQLビルダー?
JOIN をサポートする SQL クエリの作成/操作に役立つライブラリを知っている人はいますか?
オブジェクトを返すことができ、クエリが設定されていて、JOIN、サブクエリなどを適用できるものがあれば、多くの柔軟性が得られると思います。
私は周りを検索しましたが、SQL Builder しか見つかりませんでした。これは非常に基本的なようで、結合をサポートしていません。これは、本当に便利になる主要な機能です。
sql - LEFT JOIN SQL クエリの WHERE に関するヘルプ
ユーザーがドキュメントをダウンロードしたかどうかを示す列を含むクエリを作成しようとしています。次の列を持つ HasDownloaded というテーブルがあります: id、documentID、memberID。ユーザーが特定のドキュメントをダウンロードしたかどうかを調べるのは簡単です。しかし、結果が次のようになるクエリを生成する必要があります。
ID はそれほど重要ではありません。私が興味を持っているのは、ドキュメントがダウンロードされているかどうか (NULL かどうか) です。
これが私のクエリです:
問題は、HasDownloaded テーブルに指定されたユーザーのエントリが存在する場合にのみ、値が返されることです。これを単純にして、HasDownloaded にダウンロード済みのドキュメントのエントリのみを保持したいと考えています。したがって、ユーザー 1 が abc、bbb、および ccc をダウンロードした場合でも、結果のテーブルに ddd と eee が表示され、ID が NULL になるだけです。しかし、WHERE 句は、エントリが存在する値のみを提供します。
私は SQL の専門家ではありません。ここで必要なものを提供してくれる演算子はありますか? 別のアプローチをとるべきですか?それともこれは不可能ですか?
c# - 配列を単純な文字列に変換するための C# メソッド/構文は何ですか?
私が探しているのはArray::join()
、区切り文字を渡し、すべての添え字の戻り文字列でそれを使用する JavaScript の基本的な同等物です。確かに aStringBuilder
などを使用して独自の関数を作成できますが、.NET BCL には何かが組み込まれている必要があります。
編集:必ずしもorではなく、何かの配列。各 subscriptを単純に呼び出す方法をお勧めします。 文字列の配列を渡すことを除けば素晴らしいです。string
char
ToString()
object
String.Join()
sql - Cross Join の用途は何ですか?
クロス結合は、2 つのセットのタプルに対してデカルト積を実行します。
このような SQL 操作が特に役立つのはどのような状況ですか?