SQL:加入多个条件的目的/好处是什么?

时间:2017-08-10 04:10:24

标签: sql sql-server

为什么查询会在多个条件下加入?

例如:

SELECT *
FROM Sales s
    JOIN Customers c ON c.CustomerID = s.CustomerID
                        AND c.TrasactionID = s.TransactionID

在此示例中,要加入的特定字段并不重要。我刚刚制作它们来帮助说明我所要求的内容。我见过这样的问题。这通常只是出于性能原因使用还是有时需要使用多个连接条件? 谢谢!

5 个答案:

答案 0 :(得分:3)

基本上,如果在每个具有事务T1和T2的表上有2行customer_id = A,只有加入客户,则意味着您将使您的行数减少。每个A行的销售表将连接到customers表的两个A行。 customer_id = A的输出将为4行。

如果您在transaction_id上添加条件,则sales_00中的customer_id = A和transaction_id = T1的行只会加入到客户的对应行中。在这种情况下,customer_id = A的输出将只有2行。

除此之外,如果索引中使用了2列,则还可能有性能原因。如果您只调用其中一个,则可能会跳过索引,从而导致性能降低。

答案 1 :(得分:0)

  

据我了解你的问题

基本上连接用于从多个表中获取相关数据,这些表彼此内部连接。

还有许多使用连接获取数据的其他选项如(左连接,右连接,内连接,外连接等),每个连接类型都有自己的获取数据模式。

AND条件(在何处,以及在关键字比较之后)基本上用于过滤掉用户想要的精确结果。

因为当我们使用join时,有可能获得重复记录。 要删除它们,我们使用多个条件。

答案 2 :(得分:0)

这取决于为结果集定义记录的内容。我在这里采取虚拟表结构。在生产中,表结构几乎总是有一些东西可以唯一地标识记录。

假设在一张桌子中我有学生的记录(姓名,部分,年龄,rollno),但在另一个表格中,我有另一个表格中不同科目的同一学生姓名。该表包含数据(rollno,section,subject,marks,standard,year)。

现在,您可以从中获取不同类型的数据。

  1. 哪位学生在2010年获得了哪些科目的分数。

  2. 一位特殊的学生在这所学校的学术生涯中获得了什么分数。

  3. 标准9第2节的数学平均百分比是多少。

  4. 特定栏目中有多少学生通过并失败。

  5. 谁超过了哪个标准和部分。那个人的名单是什么?什么是年龄。

  6. 根据您的查询类型,您可能需要匹配不同的列以在结果集中唯一标识数据。结果集可能有相同学生,标准,部分的多行,但主题将不同。在另一种情况下,您会对rollno和name感到满意。

    根据您需要的输出,您可能需要INNER JOIN,LEFT OUTER JOIN,RIGHT OUTER JOIN,CROSS JOIN。有时,您可能需要创建视图或CTE,然后加入。其他时候,APPLY可以提供结果数据集。如果需要以某种方式聚合数据,PIVOT,UNPIVOT,GROUPING函数可以帮助ROLLUP或CUBE数据。在其他时候,在where子句或子查询中创建要匹配的函数可以提供结果集。因此,您要查询数据库以获取所需结果集的方式取决于您为数据组织创建的表结构。 SQL中有太多东西可以帮助获取结果集,这可能不是教程的最佳位置。

    如果你真的想学习有关使用SQL工作和查询的高质量内容,请在sql server上搜索Itzik ben-gan及其书籍。或者你可以获得微软70-461培训书。

答案 3 :(得分:0)

  

...有时候需要使用多个连接   条件?

是的,绝对的。这通常可以在关系数据库中发生,以确保一个表的信息与另一个表的信息正确对齐。下面是一个真实的例子,它使用多列引用来形成连接是必要的:

  

我有两个表Evalulation和Value

     

在两个表中,共有四列。但四个中有三个是   相同。换句话说,它们都有CaseNum,FileNum,ActivityNum。在   除了这些列之外,评估还有列等级和值   专栏分数。

select E.CaseNum, E.FileNum, E.ActivityNum,E.Grade,V.score 
from Evalulation E
inner join Value V ON E.CaseNum=V.CaseNum 
                  AND E.FileNum=V.FileNum
                  AND E.ActivityNum=V.ActivityNum

请参阅:How to Join two tables by multiple columns in SQL?

这里其他值得注意的项目是“连接条件”可以通过参考例如2个不同的表来确定。 E .CaseNum = V .CaseNum(表E中的内容等于表V中的内容)。

相反,“过滤条件”通常将列与常数进行比较,例如O.orderdate> ='2017-01-01'

然而,区分并不总是那么容易,因为您可以将一个表的值与另一个表进行比较:O.orderdate< S.shipdate和这种性质的谓词有时可能是有效的连接条件,但通常它们是过滤条件。

“join conditions”应始终用作已定义连接的一部分,但过滤条件可以可选在WHERE子句中使用但是如果使用任何OUTER JOIN类型,则需要注意过滤条件(左/右/全)。

前2个查询不相等,即使它们看起来非常相似。

-- list every employee, show dependent details if very young child
select *
from employee e
LEFT OUTER JOIN dependents d on e.id = d.empid and d.birthdate > '2017-01-01'

-- list only employees with very young child
select *
from employee e
LEFT OUTER JOIN dependents d on e.id = d.empid 
where d.birthdate > '2017-01-01'

-- query above produces the same result as this one
select *
from employee e
INNER JOIN dependents d on e.id = d.empid 
where d.birthdate > '2017-01-01'
  

此[多个连接条件]通常仅出于性能原因而使用吗?

希望您现在可以看到它不仅仅是“仅仅为了表现”。连接条件与过滤条件截然不同,使用倍数是必要的。使用“过滤条件”作为连接的一部分可以是可选的(例如,如果仅处理INNER JOINS),但即使这些也可以在使用OUTER JOINS时更改连接结果。

答案 4 :(得分:-1)

简单:它们在结果和性能上都是等价的!

查询优化器足够智能来决定。 JOINWHERE子句中存在过滤条件无效。

执行将保持不变,性能不会恶化也不会增加。

因此,您的示例中的两个查询都将以相同的方式运行。

但请记住OUTER JOIN s,略有不同。查询的核心逻辑可以更改如果在WHERE子句OR JOIN子句中应用过滤器,则连接不能再保留为外连接,并且在{{1}的情况下可以成为内连接} / LEFT外部联接或RIGHT成为LEFT / RIGHT outer join

我希望对你有所帮助:)。