2016-11-24 17 views
-1

私はSQLクエリの学習に取り組んでいますが、より効率的なことを実際には分かっていません。このSQLクエリのより効率的なバージョンですか?

これは私のコードです:

SELECT A.CustName, A.CustID, C.RestName, 
CONCAT(A.Address, ' - ', C.Address, ' + ', C.FoodTime, ' = ', A.Address - C.Address + C.FoodTime) 
AS DeliveryTime, B.OrderID 
FROM (SELECT * FROM Customers) AS A 
LEFT JOIN (SELECT * FROM Orders) AS B 
ON A.CustID = B.CustID 
LEFT JOIN (SELECT * FROM Restaurants) AS C 
ON B.RestID = C.RestID 
ORDER BY A.CustID; 

3つのテーブル、CustomersRestaurants、およびOrdersがあります。顧客には、CustID、CustName、およびAddressが含まれています。レストランにRestID、RestName、Address、FoodTimeが含まれています。注文には、CustID、RestID、およびOrde​​rIDが含まれています。

私はこれが次元と事実の練習であると信じていますが、私はこれらが表の中で相互作用する正しい方法について100%ではありません。誰かがそれについて良い説明をしているなら、私はすべての耳(目)です。ありがとう!

+1

「CONCAT」で何を達成しようとしていますか? 'Address'列はどのような型ですか? –

+0

CONCATは、その列で何が起こっているかを表に表示するだけです。これらのセルは、この質問のために単純に: A.Address - C.Address + C.FoodTime です。 – SteveK

+0

何を考えているのか。 '(顧客からのSELECT *から)AS B'ではなく、「顧客AS B」からですか? –

答えて

1

実際にすべてのレストランのすべての注文についてすべての顧客に関する情報が必要な場合は、クエリは「機能します」。大括弧の有無にかかわらず、既に指摘されているように(sometableからselect *)と(sometable)は同じものであり、ほとんどの人はテーブル名を入れるだけです。

コンカットの最初の部分には、住所と食事時間の情報が表示されます。 2番目の部分は、別のアドレスからアドレスを減算してから時間を追加しようとすると、使用するデータベースによってはエラーが出るでしょう(データベースが連結演算子として "+"を解釈し、実際に減算すると、の場合はが有効な文字列を取得する可能性があります。

第3に、スタイルの問題として、テーブルにエイリアスa、b、cを付けると、あなたを混乱させる可能性があります。 1文字のエイリアスはOKですが、この場合、ホエーはレストランではr、注文にはo、顧客に対してはcを使用しませんか?

+0

ありがとうございます。これはまさに私が探していたもの、「良い練習」に関するコメントなどです。 – SteveK

0

まず、これはより良い動作するはず無用(SELECT * FROM xxx) AS zzzを避ける:

SELECT C.CustName, C.CustID, R.RestName, 
    CONCAT(C.Address, ' - ', R.Address, ' + ', R.FoodTime, ' = ', C.Address - R.Address + R.FoodTime) 
    AS DeliveryTime, O.OrderID 
FROM Customers AS C 
LEFT JOIN Orders AS O 
    ON C.CustID = O.CustID 
LEFT JOIN Restaurants AS R 
    ON O.RestID = R.RestID 
ORDER BY C.CustID; 

次に、何が本当にやろうとしていますか?

+0

これは単なる練習なので、私がしようとしていることは、「現在の注文」テーブルの最初のselectステートメントにあるものを表示することです。望ましい形式で書いていただきありがとうございます。これは大いに役立ちます。 – SteveK

関連する問題