4

SSMS にはクエリ デザイナーがありますが、正直なところ、それを実際に使用することはできないため、通常は避けています。

残念ながら、私の同僚はそうしています。30 分の余裕があるので、最終的に自分が問題なのか SSMS なのかを知りたいと思います。

例: テーブルの建物、テーブルの床、テーブルの部屋、およびマッピング テーブルの使用タイプ (部屋使用タイプ) があるとします。

クエリを手動で設計するときは、次のようにします。

select all buildings, 
left join all floors in those buildings
left join all rooms in those floors
left join the room-usage_types mapping table.

今、クエリ デザイナーで同じことをしようとすると、どういうわけかマッピング テーブルから始まり、左が部屋に結合し、左が床に結合し、左が建物に結合します。

部屋のマッピングテーブルにエントリがない場合、すべての部屋が返されるわけではないため、これには根本的な欠陥があります (これは、すべての部屋が必然的にフロアにあり、すべてのフロアが必然的に建物にあるが、すべての部屋ではないことを前提としています) [一定期間]それ自体に関連付けられた使用タイプが必要です)...

ここで、結合の変更を開始すると、次のクエリが表示されます

SELECT  
FROM usage_type mapping 
RIGHT OUTER JOIN Floors 
LEFT OUTER JOIN Rooms 
RIGHT OUTER JOIN Floors

現在、このクエリは同等のように見えますが、これは一例であり、通常はさらに多くのテーブルを結合する必要があります。そのため、右結合と左結合の混在は特に好きではありません。最終的に理解するのが難しく (特に、結合が行われた場所でいくつかの ON ステートメントが続かない場合)、バグの検索がほぼ不可能になるからです。 (そして、私が望むものを理解するクエリ デザイナーの能力をあまり信頼していません)。

私はこれまでのところ、クエリを思い通りに「設計」する方法を見つけていません。唯一の方法は、最初のクエリを作成し、SQL テキストを取得し、結合を調整してから、SQL クエリ デザイナーでこれを再度開くことです。

言うまでもなく、これはそもそも手動で行うよりも時間がかかります。また、クエリ デザイナーによって SQL スクリプトが変更された場合、最初に手動で再フォーマットしないと読み取れなくなります...

私のバリアントは、クエリ デザイナーで達成することはまったく不可能であるように思えます...クエリ デザイナーでは、結合記号のコンテキスト メニューで、左側のテーブルが一番上に表示されることがあります。時々、右側のテーブル。

そして、上のものではなく下のものを選択しなければならないときは、右結合を行います。私は上のものを選ぶことができ、それは左の結合を行いますが、間違った順序で...これはまさに私が望んでいないことです...

だから私は尋ねたいと思っていました:クエリがどのテーブルから開始されるかを指定する「秘密の」方法はありますか?

4

1 に答える 1

1

コメントでのアーロンの評価には同意しますが、とにかく次の表の定義を使用して見てみようと思いました。

CREATE TABLE buildings(
building_id int primary key)

CREATE TABLE floors(
floor_id int primary key,
building_id int references buildings)

CREATE TABLE rooms(
room_id int primary key,
floor_id int references floors)

CREATE TABLE room_usage_types(
room_id int references rooms,
usage_type_id int,
PRIMARY KEY  (room_id,usage_type_id))

「Design Query In Editor」ウィンドウを表示し、CTRL キーを押しながらクリックして 4 つのテーブルを追加すると、それらを選択する順序が異なることがわかりました。

順番に選択するroom_usage_types, rooms, buildings, Dailyと、あまり役に立たないことから始まります

SELECT     
FROM         rooms INNER JOIN
                      room_usage_types ON rooms.room_id = room_usage_types.room_id CROSS JOIN
                      buildings CROSS JOIN
                      Daily

しかし、順番に選択するbuildings, floors, rooms, room_usage_typesと、はるかに有望な結果が得られます

SELECT     
FROM         buildings INNER JOIN
                      floors ON buildings.building_id = floors.building_id INNER JOIN
                      rooms ON floors.floor_id = rooms.floor_id INNER JOIN
                      room_usage_types ON rooms.room_id = room_usage_types.room_id

この開始点から、 [建物からすべての行を選択] をクリックしないでください。これにより、クエリが次のように変換されます。

SELECT     
FROM         rooms INNER JOIN
                      floors ON rooms.floor_id = floors.floor_id INNER JOIN
                      room_usage_types ON rooms.room_id = room_usage_types.room_id RIGHT OUTER JOIN
                      buildings ON floors.building_id = buildings.building_id

代わりに、間のひし形から始めて右から左に作業し、rooms, room_usage_types「部屋からすべての行を選択」などを選択します。これにより、望ましい結果が得られるようです。

SELECT     
FROM         buildings LEFT OUTER JOIN
                      floors ON buildings.building_id = floors.building_id LEFT OUTER JOIN
                      rooms ON floors.floor_id = rooms.floor_id LEFT OUTER JOIN
                      room_usage_types ON rooms.room_id = room_usage_types.room_id   
于 2011-09-10T21:40:58.767 に答える