2010-11-12 83 views
0

可能重複:
How can I rewrite this query without sub-queries?此查詢是否使用任何子查詢或臨時表?

我不允許使用子查詢或任何類型的臨時表作爲答案的一部分,這是否查詢使用到這些的?

SELECT DISTINCT item_no, avg_price 
FROM Prices 
NATURAL JOIN (SELECT AVG(totalamount) avg_price FROM Prices GROUP BY price) av 
WHERE sum > aurnover ORDER BY avg_price DESC , branch; 
+1

你想騙我們幫你做作業嗎?您可能需要查看子查詢的內容以及如何確定您的查詢是否使用臨時表。我會教你如何釣魚。查看'EXPLAIN'關鍵字。 – Vic 2010-11-12 02:53:47

+0

您在[上一個問題](http://stackoverflow.com/questions/4160857/how-can-i-rewrite-this-query-without-subqueries)中獲得幫助,請不要創建重複項。 – meagar 2010-11-12 02:55:21

+0

Google或WIKI「什麼是sql中的子查詢」......答案會爬出計算機,打擊你,然後告訴你......我就在這裏......你沒有看到me.uuh。 ..我們? – 2010-11-12 02:56:19

回答

0

您使用的這些線路上的兩個子查詢:

NATURAL JOIN (SELECT branch, AVG(totalamount) avg_price FROM Prices GROUP BY branch) av 
NATURAL JOIN (SELECT item_no,branch, SUM(totalamount) sum FROM Prices GROUP BY branch, table_no) su 
+0

..這些不是子查詢這些是派生表...有差別 – 2010-11-12 02:59:36

+0

@John Hartstock:派生表是使用子查詢結構定義的。可以非正式地說,「派生表」是「子查詢」的子類型。如果你想要一個正式的定義,請參閱SQL-92規範:第6.3節'表引用':'derived table':: ='表子查詢'。 – onedaywhen 2010-11-12 09:43:10

0

好了,你肯定患子查詢(你可以看到,顯然與嵌套的SELECT調用)。

您可能需要檢查EXPLAIN的輸出(只需將EXPLAIN附加到數據庫查詢的開頭)以確定它是否會生成臨時表。在「Extra」列中查找「using temporary」文本。

0

你有什麼派生表。

派生表類似於從一個視圖中選擇

考慮一下:

SELECT 
    * 
FROM (SELECT * FROM TABLEA) A 

如果你做了,你從外部選擇表從內選擇 注爲派生派生表選擇將僅運行一次

這是一個子查詢的示例,這將對於每TABLEA記錄

0運行一次

這也是一個子查詢

Select 
    * 
    FROM TableA 
    Where TableA.Code IN (Select TABLEB.Code From TableB) 

Subquerys一般都用在WHERE子句和列,但可能會導致嚴重的性能與問題。

+0

派生表也是一個子查詢。可以非正式地說,「派生表」是「子查詢」的子類型。如果你想要一個正式的定義,請參閱SQL-92規範:第6.3節'表引用':'派生表':: ='表子查詢' – onedaywhen 2010-11-12 09:44:32