我有两张桌子:
Shop_Products
Shop_Products_Egenskaber_Overruling
我想选择Shop_Products_Egenskaber_Overruling中有相关记录的所有记录 Shop_Products。这意味着具有相同ProductNum的记录。
这对我来说可以使用下面的声明,但我不认为CROSS JOIN是大型记录集的最佳方法。在Web控件中使用该语句时,即使只有1000条记录,它也会变得很慢。有没有更好的方法来实现这一目标?
SELECT Shop_Products.*, Shop_Products_Egenskaber_Overruling.*
FROM Shop_Products CROSS JOIN
Shop_Products_Egenskaber_Overruling
WHERE Shop_Products.ProductNum = Shop_Products_Egenskaber_Overruling.ProductNum
任何优化建议?
最好的问候。
答案 0 :(得分:3)
你可以这样做但不确定它会确保优化
SELECT Shop_Products.*, Shop_Products_Egenskaber_Overruling.*
FROM Shop_Products
INNER JOIN Shop_Products_Egenskaber_Overruling on Shop_Products.ProductNum = Shop_Products_Egenskaber_Overruling.ProductNum
答案 1 :(得分:2)
您实际上正在寻找内部联接。
SELECT
SO.*,
SPEO.*
FROM SHOP_PRODUCTS SP
INNER JOIN Shop_Products_Egenskaber_Overruling SPEO
ON SP.ProductNum = SPEO.ProductNum
这将提高CROSS-JOIN的性能,因为查找具有相同ProductNum的记录的条件隐含在JOIN
条件中,并且WHERE
子句被删除。
WHERE
子句总是在加入后执行。在您的情况下,所有可能的组合都由CROSS JOIN创建,然后通过WHERE子句中的条件进行过滤。
通过使用INNER JOIN
,您将在第一步中进行过滤。
答案 2 :(得分:1)
交叉连接速度较慢,因为它产生了所有组合,后者在谓词后面逐渐过滤。因此,您可以使用INNER JOIN来获得更好的性能。但我认为如果你检查这个查询的执行计划会很有用,因为在Oracle中,where和inner join解决方案之间没有区别Inner join vs Where
答案 3 :(得分:0)
尝试使用INNER JOIN
SELECT Produkter.*, Egenskaber.*
FROM Shop_Products Produkter
INNER JOIN Shop_Products_Egenskaber_Overruling Egenskaber ON Produkter.ProductNum=Egenskaber.ProductNum
Jag namngav aven dem pa Norska ..