私は3つのテーブルを持っています:
- 注文
- OrderId、int PK
- CustomerId、Customer への int FK、NULL を許可
- お客様
- CustomerId、int PK
- CompanyId、Company への int FK、NULL は許可されません
- 企業
- CompanyId、int PK
- 名前、nvarchar(50)
顧客がいるかどうかに関係なく、すべての注文を選択し、顧客がいる場合は顧客の会社名も選択したいと考えています。
このクエリを使用すると...
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
INNER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId
...顧客がいる注文のみを返します。に置き換えるINNER JOIN
とLEFT OUTER JOIN
...
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
LEFT OUTER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId
Customers
...動作しますが、との関係が必要なため、これが必要な理由がわかりませんCompanies
: 顧客には会社が必要です。
同様に機能する代替アプローチは次のようです。
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Companies
INNER JOIN Customers
ON Companies.CompanyId = Customers.CompanyId
RIGHT OUTER JOIN Orders
OM Customers.CustomerId Orders.CustomerId
このクエリには、予想される内部結合と外部結合の数がありますが、問題は、注文が選択の「ルート」であり、選択の「ルート」ではない注文のクエリとしてクエリを念頭に置いているため、読みにくいことです。会社。また、 の使用法はRIGHT OUTER JOIN
私にはあまりなじみがありません。
最後のクエリは、SQL Server Reporting Services レポートのデザイナーによって生成されたクエリの一部です。非常に混雑していて、多くの変更後にクエリを維持するのに問題があり、将来さらに多くの変更が予想されるため、デザイナー画面なしでクエリを手動で記述しようとしています。だから、どうにかしてクエリに読み取り可能な構造を与えたいと思います。
質問:
- クエリ 1 が期待どおりに機能しないのはなぜですか?
- クエリ 2 は、2 つの LEFT OTHER JOINS を使用していますが (またはそのため?)、正しい解決策ですか?
- クエリ 3 は正しい解決策ですか?
- クエリを記述するより良い方法はありますか?
- 多くの外部結合と内部結合を含むクエリを読みやすい方法で作成するための一般的な経験則と実践方法はありますか?