2010-11-12 62 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