1

我只知道基本的 SQL,但我正在处理的项目使用非常复杂的查询。有一个我无法理解的查询。关注的表和字段是peopleperson_details更脏的查询的可执行部分是:

SELECT people.first_name
    , people.last_name
    , person_statuses.name as person_status
    , companies.name as company_name
    , person_roles.name as role 
    , person_role_memberships.event_name as membership_year
    , person_role_memberships.start_date as start_date
    , person_role_memberships.end_date as end_date
    , person_role_memberships.sponsor_parent_company as sponsor_parent_company
    , person_role_memberships.former_sponsor_parent_company as former_sponsor_parent_company
    , person_role_memberships.workshop as workshop
FROM people
    , *person_details as business_details*
    , *person_details*
    , person_roles
    ,  person_role_memberships
    , companies
    , person_statuses
    , companies as parent_companies
WHERE person_role_memberships.person_id = people.id 
    AND person_role_memberships.person_role_id = person_roles.id 
    AND 

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

    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;

我想知道该where子句的粗体部分创建的逻辑是什么。是不是因为AND关键字,只允许那些有 BusinessDetail 和 PersonalDetails 的人是person_details表?

4

2 回答 2

1

应该是自加入吧。当你有一个与自身相关的关系(表)时,通常使用它(employees <-> boss),或者当一个关系(表)用于存储某一行的不同类型的信息时。

在您的示例中,表person_details用于存储业务个人信息。连接是:

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

所以我会说该表在表中的同一行的不同行上person_details保存业务个人信息。people.idpeople

于 2012-04-11T14:55:51.050 回答
0

它基本上是在说:

该人必须有一个必须是“BusinessDetails”类型的 business_details 记录,并且该人必须有一个必须是“PersonalDetail”类型的 person_details 记录看起来两者都存储在同一个表中(business_details 是 person_details 的别名表),因此它两次加入表以检查这两个条件。

我不确定这是什么风格的 SQL(SQL Server/Oracle 等),但使用适当的连接语法可能会更简洁地写出查询(尽管使用的语法会在后台创建连接,但它并不容易读作具有显式连接语法的东西)。

于 2012-04-11T15:01:52.550 回答