2016-04-28 13 views
1

sqlデータベースからデータを取得した場合、データベースに関係がある場合は、「値」と「テーブル」の列が自動的に作成されます。 enter image description hereパワークエリ言語(M言語)では、カスタム "値"と "テーブル"の列を手動でテーブルに追加するにはどうしたらいいですか?

AFAIK「表」と「値」は、それぞれ1対多の関係と多対1の関係をそれぞれ意味します。

私の問題は、私たちのデータベースには関係がないということです。したがって、PowerQueryはこれらの列を自動的に生成することはできません。 対象テーブル間の関係が分かっている場合は、これらの列を手動で追加するにはどうすればよいですか?

は私が

(。データベース内の関係があるにもかかわらず、しかし、低性能の)テーブルオブジェクトを返すTable.NestedJoin機能を発見した。しかし、私はのValueオブジェクト(レコードを返す任意の関数を見つけることができませんでした別のテーブル)。

他の可能性のある脆弱性の解決策は次のとおりです。

  1. Power BIのリレーションシップセクション(またはExcelの電源ピボットセクション)で、テーブルをデータベースとして取得し、リレーションシップを作成することをお勧めします。しかし、このValueオブジェクトはパワークエリで必要です。なぜなら、テーブルのすべての行をロードする前に、関連するテーブルに従ってローをフィルタ処理したいからです。
  2. 自分の好みではないテーブルを結合するネイティブクエリを作成します。
  3. ValueオブジェクトではなくTableオブジェクトを作成しています(レコードが1つしかないと確信しています)。まだTable.NestedJoinメソッドのパフォーマンスに問題があります。別のオプションがありますか?

事前のおかげで...

+2

1-好奇心の念から、データソースとは何ですか?なぜ外部キーを追加しないでください(リレーショナルデータベースの場合) 2 1行しかないことがわかっている場合は、Table.First(table、nullable defaultValue)を呼び出してレコードにすることができます。 3あなたはネイティブクエリを使用するカスタム列を追加することをお勧めしますが、それはあなたの好みではないことが分かりました:) 4 NestedJoinのパフォーマンスは、データベースに対してクエリを折りたたむことができないと悪くなります。実際に関連して、私たちはすべての行をダウンロードします。このため、ネイティブクエリーがこのケースではより良いでしょう。 –

+2

ネストされた結合の間にJoinKind.Inner(0)を使用しましたか?これはWHERE句としてサーバに返されます。標準設定では、LeftOuterとして機能します。返されるデータセットをさらに減らしたい場合は、そのInnerJoinを実行する前にまず結合テーブルにフィルタを適用します。 (編集:既に削除した投稿を読んでいる場合:それは、Table.Bufferのために折り畳まれないで、バッファなしでは遅くならないようにしないという完璧な例でした。定義によってすべての行を繰り返し、「ルックアップテーブル」との比較を実行します) – ImkeF

+0

@OğuzYıldızDatasourceはSQLサーバデータベースです。しかし、このデータベースはずっと前に設計されています。そして(今まで)彼らはデータベース内の関係を定義することを拒否しました。私はTable.First関数を知らなかった。私はそれが私の必要を満たすだろうと思う。そして、私はクエリーフォールディングについて読んでいます。ありがとうございました。 – serdar

答えて

0

ちょうど今日、私は、パフォーマンスと全く同じ問題があったが、最終的にそれを解決しました。私のソリューションでは、ビューを扱いますが、レコードをフィルタリングする必要があります。

let 
    filter1 = 2016, 
    filter2 = "SomeText", 
    tbl = Sql.Database("MyServer","MyDB"){Schema="dbo",Item="MyTableOrView"}[Data], 
    filteredTable = Table.SelectRows(tbl, each ([field1] = filter1) and ([field2] = filter2)) 
in 
    filteredTable 

それが遅い動作します:
は、私はそのようなコードを使用する場合。しかし、もし私がNestedJoinを試してみると、それははるかに優れています。

let 
    Source = Table.FromColumns({{2016}, {"SomeText"}}, "filter1", "filter2"), 
    tbl = Sql.Database("MyServer","MyDB"){Schema="dbo",Item="MyTableOrView"}[Data], 
    filteredTable = Table.NestedJoin(tbl, {"field1", "field2"}, Source, {"filter1", "filter2"}, "NewColumn", JoinKind.Inner) 
in 
    filteredTable 

しかし、私は私が得たとしても最速のデザインビューからすべての~~ 1300行を返すだけで、クエリよりも遅く働くことに気づきました。

サーバーに送信される内容を追跡するSQLプロファイラはありませんが、内部結合を使用するとクエリ折りたたみが動作するようです。

以下を試してみましょう:2つのテーブルに対して2つのクエリを実行してください(他のアクションはありません!)、内部結合して、より速く動作するかどうかを確認してください。

関連する問題