SQL多表连接查询

时间:2017-08-30 06:08:24

标签: sql

我有两个表,College_Infra_itemsCollege_infrastructure

College_Infra_items表具有以下结构和示例数据:

col_infraId  requiredSeat  available collegeInfrastructureId collegeId
-----------------------------------------------------------------------
   1         100              150           1                   2
   2         200              180           2                   2
   3         200              160           3                   3
   4         300              190           4                   3

College_infrastructure具有以下结构和示例数据:

collegeInfrastructureId  type    name
--------------------------------------------------------------
     1                   UGC     Land Requirement(In acres)
     2                   UGC     Class rooms
     3                   UGC     Total Area
     4                   UGC     Loans

现在我正在写这样的查询

SELECT 
    ci.collegeInfrastructureId as collegeInfrastructureId,
    ci.type as type, ci.name as name,
    cli.requiredSeat as requiredSeat,
    cli.available as available   
FROM 
    college_infrastructure ci
LEFT JOIN 
    College_Infra_items cli ON cli.collegeInfrastructureId = ci.collegeInfrastructureId
WHERE 
    ci.type=:type AND cli.collegeId=:collegeId
ORDER BY 
    ci.collegeInfrastructureId ASC";

我正在尝试显示college_infrastructure表中名称列的所有行以及填充在college_infraitems表中所需席位和可用列中的任何行。但现在它只从两个表中返回填充的细节。无论collegeId如何,我都需要从college_infrastructure表中获取所有类型的所有行。但是由于我提到collegeId的where子句中的条件,只返回了两行。

如果大学id = 2,那么它只返回两行。我需要显示college_infrastructure表中的所有名称和college_infraitems表中的填充数据。任何人都可以告诉如何实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

使用LEFT JOIN时, first 表中的条件会进入WHERE子句。 second 表中的条件位于ON子句中;否则,外连接将变为内连接:

SELECT ci.collegeInfrastructureId, ci.type, ci.name,
       cli.requiredSeat, cli.available   
FROM college_infrastructure ci LEFT JOIN
     college_Infra_items cli
     ON cli.collegeInfrastructureId = ci.collegeInfrastructureId AND
        cli.collegeId = :collegeId
WHERE ci.type = :type 
ORDER BY ci.collegeInfrastructureId asc;

此外,您不需要使用as将列重命名为与其相同的名称。因此,默认情况下,ci.type将被称为type。无需使用ci.type as type混乱查询。