【问题标题】:understanding the logic of AND and WHERE in t-sql理解t-sql中AND和WHERE的逻辑
【发布时间】:2018-10-12 08:04:43
【问题描述】:

我正在研究 Transact-SQL,Microsoft Azure。 我试图理解为什么在某些连接查询中WHEREAND 都可以使用并给出相同的结果(或者至少在我的数据库中看起来是相同的结果)而在其他查询中where 没有t 工作并且确实。

在这里,我要加入 2 个表:

select c.customerID, ca.addressID, ca.addressType
from salesLT.customer as c
join salesLT.customerADdress as ca
on c.customerID = ca.customerID
WHERE ca.addressType = 'Main Office';  --WHERE or AND works the same

这给了我我正在寻找的内容 = 只有 customerAddress 表中类型为“Main Office”的行。将单词 WHERE 更改为 AND 会得到完全相同的结果。

现在,查询是基于以前的,但我正在尝试加入 3 个表。这里WHERE 不起作用,我必须输入AND

select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a. city
from salesLT.customer as c
join salesLT.customerAddress as ca
on c.customerID = ca.customerID
WHERE ca.addressType = 'Main Office' -- error: incorrect syntax near 'join'
join salesLT.address as a
on ca.addressId = a.addressID; 

如果我将 WHERE 更改为 AND 它可以工作。为什么? 2个表和3个表的join有什么区别? 谢谢

【问题讨论】:

  • 第二个JOIN 应该在WHERE 子句之前
  • 这就是为什么您应该在尝试编写/修改代码之前检查文档以了解该语言的语法,而不是仅仅在随机位置粘贴新位然后感到困惑。
  • @underscore_d 在随机位置粘贴新位被称为通过双手学习。如果这让您如此生气,则无需帮助其他人。
  • 不错的尝试,但我不生气。我只是不明白为什么这么多人认为反复试验是一种很好的学习方式,或者至少是其他人应该支持他们的一种方式。
  • 我什至不知道我为什么要费心回答,考虑到这些攻击性的 cmets 在这里很常见,但也许有人会从这次谈话中学到一些东西。你的问题的答案在于问题本身——你不明白为什么人们认为一种特定的方式是很好的学习方式。试着想象有些人的想法和学习方式与你不同,我知道这很难,但你可能会从你周围的人身上学到一些东西。再说一次,如果你不想支持,就不要……

标签: tsql join where-clause


【解决方案1】:

如果我将 WHERE 更改为 AND 它可以工作。为什么?

因为使用and 是将条件添加到on 子句中,而使用where 是一个新子句。

这里是完整的解释:select 语句在使用多个连接时的基本语法是:

SELECT <columns>
FROM <table 1>
JOIN <table 2> ON <condition>
JOIN <table 3> ON <condition>
WHERE <condition>

这意味着您的第二个查询应如下所示:

select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a.city
from salesLT.customer as c
join salesLT.customerAddress as ca on c.customerID = ca.customerID
join salesLT.address as a on ca.addressId = a.addressID
WHERE ca.addressType = 'Main Office';

如果您访问该链接,您会发现 select 语句的语法可能会变得更加复杂 - 但现在,基本语法应该足以让您入门。

【讨论】:

    【解决方案2】:

    第二个JOIN 应该在WHERE 子句之前

    select c.customerId, c.companyName, ca.addressID, ca.addressType, a.addressLine1, a. city
    from salesLT.customer as c
    join salesLT.customerAddress as ca
    on c.customerID = ca.customerID
    join salesLT.address as a
    on ca.addressId = a.addressID
    WHERE ca.addressType = 'Main Office' 
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多