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时,有可能得到重复的记录。
要删除它们,我们使用多个条件。这取决于为结果集定义记录的内容。我在这里使用虚拟表结构。在生产中,表结构几乎总是有一些东西来唯一地标识记录 假设,在一个表中,我有学生的记录(姓名、分区、年龄、学号),但在另一个表中,我有另一个表中不同科目的相同学生姓名。该表包含如下数据(编号、区段、主题、分数、标准、年份) 现在,您可以从中获取不同类型的数据
此处其他值得注意的事项是,“连接条件”可以通过以下事实来确定:引用了两个不同的表,例如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'