Sql 在一个表中,列上两次使用不同的别名进行连接意味着什么?

Sql 在一个表中,列上两次使用不同的别名进行连接意味着什么?,sql,database,Sql,Database,我只知道基本SQL,但我正在处理的项目使用非常复杂的查询。有一个问题我不明白。关注的表和字段是people和person\u details,更脏的查询的可执行部分是: 我想知道where子句的粗体部分创建的逻辑是什么。是不是因为和关键字,只允许那些拥有BusinessDetail和PersonalDetails的人员进入person\u details表?这可能是一个自连接。它通常用于与自身相关的关系(表)(employees boss),或用于存储特定行的不同类型信息的关系(表) 在您

我只知道基本SQL,但我正在处理的项目使用非常复杂的查询。有一个问题我不明白。关注的表和字段是
people
person\u details
,更脏的查询的可执行部分是:


我想知道
where
子句的粗体部分创建的逻辑是什么。是不是因为
关键字,只允许那些拥有BusinessDetail和PersonalDetails的人员进入
person\u details
表?

这可能是一个自连接。它通常用于与自身相关的关系(表)(
employees boss
),或用于存储特定行的不同类型信息的关系(表)

在您的示例中,表
person\u details
用于存储业务人员信息。连接为:

business_details.person_id = people.id 
AND person_details.type = 'PersonalDetail' 
AND person_details.person_id = people.id

所以我想说,
person\u details
表为同一
people.id
表中的
people
行保存业务人员信息。

它可能是一个自连接。它通常用于与自身相关的关系(表)(
employees boss
),或用于存储特定行的不同类型信息的关系(表)

在您的示例中,表
person\u details
用于存储业务人员信息。连接为:

business_details.person_id = people.id 
AND person_details.type = 'PersonalDetail' 
AND person_details.person_id = people.id
所以我想说,
person\u details
表为同一
people.id
表中的
people
行保存业务人员信息

此人必须有一个业务详细信息记录,该记录必须为“BusinessDetails”类型,并且此人必须有一个人员详细信息记录,该记录必须为“PersonalDetail”类型。看起来两者都存储在同一个表中(业务详细信息是人员详细信息表的别名),因此,它连接到表两次,以检查这两种情况

我不确定这是什么味道的SQL(SQL Server/Oracle等),但使用适当的联接语法可能会更简洁地写出查询(虽然使用的语法会在引擎盖下创建联接,但它不像使用显式联接语法的东西那么容易阅读)。

它基本上是说:

此人必须有一个业务详细信息记录,该记录必须为“BusinessDetails”类型,并且此人必须有一个人员详细信息记录,该记录必须为“PersonalDetail”类型。看起来两者都存储在同一个表中(业务详细信息是人员详细信息表的别名),因此,它连接到表两次,以检查这两种情况



我不确定这是什么味道的SQL(SQL Server/Oracle等),但使用适当的连接语法可能会更简洁地写出查询(虽然使用的语法会在后台创建连接,但它不像使用显式连接语法的东西那么容易阅读)。

如果我说我知道基本SQL,那就很抱歉了。我不明白你说的话。你是说person_details表和它自身相关吗?好吧,我的问题是,这是什么逻辑?我想问的是,这个查询用简单的英语会读什么。对不起,如果我说我懂基本的SQL。我不明白你说的话。你是说person_details表和它自身相关吗?好吧,我的问题是,这是什么逻辑?我想问的是,这个查询用简单的英语读什么。请使用正确的连接语法,而不是逗号,并使用表别名,以使您的SQL更干净。我也会这样做。整个项目充满了这样复杂的查询,我只是在添加一些小功能,并从一个已经构建的项目中删除bug。但是我没有时间(或意愿)去纠正别人的错误。@Jamie:如果一个程序员被指派做一个特定的改变,他不应该自己去改变项目范围之外的其他事情。这意味着OP决定重写生产系统中的工作SQL以使其“更干净”,这将是一个首要的错误。OP试图了解现有查询的功能,而不是如何从头开始编写更好的查询。@Larry,是的,我同意。我应该澄清一下:我的评论只是针对在代码中添加换行符(在SQL语法中毫无意义)。它最初是作为三行共享的,没有换行符。@Jamie:我很抱歉。我以为你是在放大蓝脚的评论。请使用正确的连接语法,而不是逗号,并使用表别名,使您的SQL更干净,我也会这样做。整个项目充满了这样复杂的查询,我只是在添加一些小功能,并从一个已经构建的项目中删除bug。但是我没有时间(或意愿)去纠正别人的错误。@Jamie:如果一个程序员被指派做一个特定的改变,他不应该自己去改变项目范围之外的其他事情。这意味着OP决定重写生产系统中的工作SQL以使其“更干净”,这将是一个首要的错误。OP试图了解现有查询的功能,而不是如何从头开始编写更好的查询。@Larry,是的,我同意。我应该澄清一下:我的评论只是针对在代码中添加换行符(在SQL语法中毫无意义)。它最初是作为三行共享的,没有换行符。@Jamie:我很抱歉。我以为你在夸大蓝脚怪的话。谢谢蒂姆。即使表中缺少任何一个细节,条件是否为false?PersonalDetails或BusinessDetails?如果缺少其中一个详细信息,则该行将被排除在结果之外,两者都必须出现才能显示在结果中。谢谢Tim。即使表中缺少任何一个细节,条件是否为false?个人详情或业务详情a
    AND people.person_status_id = person_statuses.id 
    AND ifnull(companies.parent_id, companies.id) = parent_companies.id  
    AND people.company_id = companies.id 
    AND companies.name = 'Pak Qatar' 
    AND people.last_name = 'Aslam' 
limit 100;
business_details.person_id = people.id 
AND person_details.type = 'PersonalDetail' 
AND person_details.person_id = people.id