SQL:What';在多种条件下加入的目的/好处是什么?

SQL:What';在多种条件下加入的目的/好处是什么?,sql,sql-server,Sql,Sql Server,为什么要在多个条件下联接查询 例如: SELECT * FROM Sales s JOIN Customers c ON c.CustomerID = s.CustomerID AND c.TrasactionID = s.TransactionID 在本例中,要联接的特定字段并不重要。我只是编造它们来帮助说明我的要求。我见过这样的问题。这通常只是出于性能原因,还是有时需要使用多个连接条件? 谢谢 基本上,如果在事务T1和T2的每个表上都

为什么要在多个条件下联接查询

例如:

SELECT *
FROM Sales s
    JOIN Customers c ON c.CustomerID = s.CustomerID
                        AND c.TrasactionID = s.TransactionID
在本例中,要联接的特定字段并不重要。我只是编造它们来帮助说明我的要求。我见过这样的问题。这通常只是出于性能原因,还是有时需要使用多个连接条件?
谢谢

基本上,如果在事务T1和T2的每个表上都有两行customer_id=A,而customer上只有join,这意味着将对行数进行反乘。sales表的每个A行都将连接到customers表的两个A行。customer_id=A的输出将为4行

如果在交易\ id上添加条件,则sales中customer \ id=A且交易\ id=T1的行将仅连接到customers中的对应行。在这种情况下,customer_id=A的输出将仅为2行


除此之外,如果在索引中使用这两列,还可能有性能原因。如果只调用其中一个,可能会跳过索引,导致性能降低

简单来说:两者在结果和性能上都是等价的

查询优化器足够聪明,可以做出决定。
JOIN
WHERE
子句中的筛选条件的存在将不起作用

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

因此,在您的示例中,两个查询的运行方式相同

但请记住这一点当涉及到
外部连接时
s,它与略有不同。如果在
WHERE
子句或
JOIN
子句中应用过滤器,则查询的核心逻辑可能会更改,联接不能再保持外部联接,如果是
左侧
/
右侧
外部联接,则联接可以成为内部联接;如果是
完全外部联接
,则联接可以成为
左侧
/
右侧
外部联接

我希望能对您有所帮助:)

据我所知,你的问题

基本上,联接用于从内部相互连接的多个表中获取相关数据

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

而条件(where、AND、on关键字比较后)基本上是用来根据用户的需要过滤出准确的结果

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

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

假设,在一个表中,我有学生的记录(姓名、分区、年龄、学号),但在另一个表中,我有另一个表中不同科目的相同学生姓名。该表包含如下数据(编号、区段、主题、分数、标准、年份)

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

  • 2010年,哪个学生在哪些科目上得了什么分数

  • 有一个学生在这所学校的整个职业生涯中都得了什么分数

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

  • 有多少学生在特定的部分通过和失败

  • 谁在哪一个标准和章节中获得了冠军。那个人的卷号是多少,年龄是多少

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

    根据输出的需要,可能需要内部联接、左外部联接、右外部联接、交叉联接。有时,您可能需要创建一个视图或CTE,并加入其中。其他时候,APPLY可以提供结果数据集。如果需要以某种方式聚合数据,PIVOT、UNPIVOT和GROUPING函数可以帮助汇总或多维数据集。有时,在where子句或子查询中创建要匹配的函数可以提供结果集。因此,查询数据库以获取所需结果集的方式取决于为数据组织创建的表结构。SQL中有太多东西可以帮助获取结果集,而这可能不是学习教程的最佳场所

    如果您真的想学习有关使用SQL进行工作和查询的高质量知识,请搜索Itzik ben gan和他关于SQL server的书籍。或者您可以获得Microsoft 70-461培训手册

    。。。是否有时需要使用多个联接 状况

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

    我有两张评估表和价值表

    在这两个表中,共有四列。但这四个中有三个是 一样。换句话说,它们都有CaseNum、FileNum、ActivityNum。在里面 除了这些列之外,评估还有列级别和值 列分数

    见:


    此处其他值得注意的事项是,“连接条件”可以通过以下事实来确定:引用了两个不同的表,例如e.CaseNum=V.CaseNum(表e中的某个值等于表V中的某个值)

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

    然而,区分并不总是那么容易,因为您可能会比较值
    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
    
    -- 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'