我想知道为什么join语句非常流行,因为许多字段可能在结果行中重复。
Supplier(id, name, address)
Product(id, name, detail)
Product_Supplier(id, productId, supplierId, quantity)
SELECT Product.*,
Product_Supplier.supplierId,
Product_Supplier.quantity
FROM Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId
结果可能如下所示:
Product.id Product.name Product.detail Product_Supplier.supplierId Product_Supplier.quantity
1 'Product 1' 'bla bla' 100 20
1 'Product 1' 'bla bla' 101 30
1 'Product 1' 'bla bla' 102 20
1 'Product 2' 'bla bla' 100 120
因此如果product.detail
是大文本,那么性能会变慢,对吗?如果这是真的,为什么加入声明很受欢迎?
答案 0 :(得分:3)
JOIN不受欢迎,需要使用来自多个表的数据来组合结果。
假设您有一个包含产品和其他产品的表格,您希望开发一个程序,生成包含所有销售的详细信息的报告。你需要撰写每一行,怎么做?您可以在程序中使用查询和中间数据结构,或者您可以请求数据库为您执行此操作。因此加入两个表。
在这种情况下,如果product.detail
过大且您不希望在结果中使用,则应避免将其包含在所选列中。类似的东西:
SELECT Product.name,
Product_Supplier.supplierId,
Product_Supplier.quantity
FROM Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId
取而代之的是SELECT Product.* ...
答案 1 :(得分:1)
加入是在一个语句中从不同来源(表,函数,视图等)获取数据的唯一方法。
考虑到您的样本,如何在没有加入的情况下从产品供应商和产品获取所有信息?
当然,您可以在自己的照片中放置多张桌子,而且差异并不大。当关系变得复杂时,联接非常有用。
如果您遇到名称冲突问题,请添加别名:
SELECT Product.id product_id
, ...
FROM Product
INNER JOIN Product_Supplier ON Product.id = Product_Supplier.productId
考虑到您的效果标记:联接并不总是比其中的多个表表现更好。例如,Oracle在视图关系和ANSI连接中存在一些问题。