【问题标题】:SQL - Multiple joins with WHERE & Order BySQL - 使用 WHERE 和 Order By 进行多个连接
【发布时间】:2017-09-20 14:35:04
【问题描述】:

数据库:

    Car:                          Contract:          Customer:
    Carplate (PRKEY)              Contractid(PRKEY)  CustomerID(PRIK)
    PRICE                         Miles              Customername
    Leased(0Free- 1Leased)        Carplate(FKEY)     Zipcode
                                                     ContractID FKEY)
                                                     Carplate(FKEY)

我想获取所有租车 (=1) 的当前里程客户名分组方式(错误排序方式)客户的邮政编码

语法

SELECT * 
FROM table1 INNER JOIN table2 ON 
     table1.primaryKey=table2.FKEY INNER JOIN 
     table3 ON table2.primaryKey=table3.FKEY

问题:我不明白这里的 INNER JOIN 和 where 子句的正确用法。

Select Car.Leased, Contract.Miles, Customer.Customername, Customer.Zipcode
From Car 
INNER JOIN Contract  on Car.Carplate = Contract.Carplate
INNER JOIN Customer  on Contract.Carplate = Customer.Carplate
where Car.Leased = 1
order by Customer.Zipcode ASC

尝试通过语法创建代码。对吗?

【问题讨论】:

  • 看起来还不错。你得到预期的结果了吗?
  • JOINs 最终会根据其类型创建所涉及表的行的几种组合 - INNER, OUTER, LEFT, RIGHT, 等。where 子句过滤掉相关的。
  • 我在纸上学习。
  • 关于数据库本身的明显问题:如果customer 表是contract 的子表,则基于contractid,而contractcar 的子表,基于carplate ,为什么您customer 中有carplate?对汽车的提及是否意味着客户与合同中的汽车相关联?如果是这样,您需要说明应该使用从客户到汽车的哪个链接。 (更可能的是,情况并非如此 - 客户唯一的汽车是合同中的汽车,您不需要 customer 表中的 carplate。)

标签: sql oracle select sql-order-by where


【解决方案1】:

我不明白 INNER JOIN here 和 where 的正确用法 子句

INNER JOIN 将返回两个表之间的公共数据,WHERE 子句将精炼一个特定表中的数据。

我想获取所有租赁汽车 (=1) 的当前里程, 客户名称和按客户的邮政编码分组

根据您的查询,您正在做order by Customer.Zipcode ASC。所以,GROUP BYORDER BY 是有区别的

【讨论】:

  • 更具体的问题:First From 仅适用于 Car,为什么不适用于 Customer 和 Contract?第二:语法总是这样? = t1.primarykey=t2.fkey t2.fkey=t3.fkey ?
【解决方案2】:

看起来您还想使用 ContractID 加入 Customer 表 - 我正在阅读表结构的方式,如果汽车被转售,Carplate 可能会显示给多个客户。您也不一定需要选择 Leased,因为您知道您只会获得 Leased = 1 的记录。但是,如果您想将其保留为健全性检查,则不会造成任何伤害。

SELECT Contract.Miles, Customer.Customername, Customer.Zipcode
FROM Car
INNER JOIN Contract ON Car.Carplate = Contract.Carplate
INNER JOIN Customer ON Contract.Contractid = Customer.ContractID AND 
Car.Carplate = Customer.Carplate
WHERE Car.Leased = 1
ORDER BY Customer.Zipcode ASC

【讨论】:

  • 嗯,好吧,所以我需要在“最后一个”内部连接中比较每个表以获得客户结果:语法如下:从 t1 INNER JOIN t2 on t1.PRIK = t2.FKEY INNER JOIN t3 on t2.FKEY= t3 FKEY && t2.FKEY = t3.FKEY 正确吗?
  • 不一定。这完全取决于您要加入的特定表。您可以让 t2 与 t1 具有外键,而 t3 与 t2 具有外键但与 t1 无关,您仍然可以加入所有 3。
  • 啊,好吧,在这种情况下,需要最后的比较,才能从数据库中获取汽车的实际“所有者”,而不是所有旧的“汽车所有者”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多