哪种方法最好从多个表中获取数据

时间:2016-09-23 11:14:16

标签: sql-server

我有2个表,并假设有大量数据

Table1                   Table2
Id  Name Address         Id  Table1Id Parents_Name Address
1   ABC  123ABC           1     1      DDD          Xyz
.   ...  ......           .     .      ...          ...
.   ...  ......           .     .      ...          ...

现在,如果我想要以下格式的解决方案

Id  Name  Parents_Name
1   ABC      DDD
.   ...      ...
.   ...      ...
然后哪一个是最好的 子查询加入

5 个答案:

答案 0 :(得分:0)

假设您需要INNER JOIN

SELECT t1.Id
    ,t1.Name
    ,t2.Parents_Name
FROM table1 t1
INNER JOIN table2 t2
    ON t2.Table1Id = t1.Id

但您也可以使用OUTER JOIN始终显示table1中的行,并显示来自table2的匹配行。

SELECT t1.Id
    ,t1.Name
    ,t2.Parents_Name
FROM table1 t1
LEFT OUTER JOIN table2 t2
    ON t2.Table1Id = t1.Id

答案 1 :(得分:0)

您将需要使用连接,这几乎肯定会更有效率。快速谷歌提供了比您需要了解的更多信息,了解可用的不同类型的连接以及如何使用它们,例如https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

答案 2 :(得分:0)

请在Table2的Table1和Table1Id的id上创建索引并使用此查询。

Select t1.Id,
t1.Name,
t2.Parents_Name
from Table1 t1 
inner join 
Table2 t2 on t1.id=t2.Table1Id

答案 3 :(得分:0)

恕我直言,考虑到查询性能,加入应该是首选。 Squbquery将需要 IN 运算符,这对于批量数据来说总是很麻烦。但是,它还取决于您的索引。你最好检查一下。

答案 4 :(得分:0)

加入子查询都用于查询来自不同表的数据,甚至可能共享相同的查询计划,但它们之间存在许多差异。了解差异以及何时使用 join 子查询来搜索来自一个或多个表的数据是掌握SQL的关键。

加入子查询都用于将来自不同表的数据合并为一个结果。他们有许多相似之处和不同之处。

子查询可用于返回标量(单个)值或行集;而连接用于返回行。

子查询的常见用途可能是计算在查询中使用的汇总值。例如,我们可以使用子查询来帮助我们获得所有产品的平均产品价格。

SELECT ProductID,
       Name,
       ListPrice,
       (SELECT AVG(ListPrice)
          FROM Production.Product) AS AvgListPrice
  FROM Production.Product
 WHERE ListPrice > (SELECT AVG(ListPrice)
  FROM Production.Product)

此SELECT语句中有两个子查询。第一个目的是显示所有产品的平均定价,第二个目的是过滤掉小于或等于平均定价的产品。 子查询免费视频优惠

此处子查询返回一个值,然后用于过滤掉产品。

注意子查询是如何查询的。在此示例中,您可以将不带括号的子查询粘贴到查询窗口中并运行它。

将此与连接进行对比,连接的主要目的是根据匹配条件组合来自一个或多个表的行。例如,我们可以使用连接显示产品名称和模型。

Select Product.Name,
       ProductModel.Name as ModelName
FROM   Production.product
       INNER JOIN Production.ProductModel
       ON Product.ProductModelID = ProductModel.ProductModelID

在本声明中,我们使用INNER JOIN来匹配Product和ProductModel表中的行。请注意,ProducModel.Name列可在整个查询中使用。

然后,select语句可以使用组合的行集,用于按列显示,过滤或分组。

这与子查询不同。子查询返回一个结果,立即使用。

请注意,join是select语句的组成部分。它不能独立存在,因为子查询可以。

子查询用于从主查询中运行单独的查询。在许多情况下,返回的值显示为列或在过滤条件中使用,例如where或having子句。当子查询包含来自主查询的列时,它被认为是相关的。通过这种方式,子查询有点像连接,可以比较两个或多个表中的值。

连接用于WHERE语句的FROM子句中;但是,您会在大多数子句中找到子查询,例如:

SELECT List – here a subqueries used to return single values are used.
WHERE clause– depending on the conditional operator you’ll see single value or row based subqueries.
FROM clause– It is typical to see row based result subqueries used here.
HAVING clause – In my experience scalar (single value) subqueries are used here.

虽然连接和子查询有很多不同之处,但它们可用于解决类似的问题。实际上,仅仅因为您将SQL语句编写为子查询并不意味着DBMS会这样执行。

您可以参考此链接了解更多详情: - http://www.essentialsql.com/what-is-the-difference-between-a-join-and-subquery/