使用别名和不使用它们之间的区别

时间:2016-06-19 15:17:10

标签: sql scope

考虑以下关系

Seller(idSeller, ...)
Car(idCar, ...)
Customer(idCustomer, ...)
Sale(idSeller, idCar, idCustomer, ...)

以下查询是否相同? (他们会产生相同的结果吗?)

Q1

SELECT *
FROM Seller e, Car r, Customer c, Sale s
WHERE s.idSeller = idSeller AND s.idCar = idCar AND s.idCustomer = idCustomer;

Q2

SELECT *
FROM Seller e, Car r, Customer c, Sale s
WHERE s.idSeller = e.idSeller AND s.idCar = r.idCar AND s.idCustomer = c.idCustomer;

请注意,这不是针对特定的DBMS,而是针对SQL的练习(针对SQL-99标准)。

3 个答案:

答案 0 :(得分:1)

您是否尝试过运行这些查询?

第一个不适用于大多数RDBMS;它应该引发关于'模糊列'的错误。

您不能使用相同的名称引用不同表上的不同列;这就是别名存在的原因!当存在多于1时,DBMS将无法确定idCar所指的列。

如果此查询确实运行,请不要依赖RDBMS选择正确的查询。

答案 1 :(得分:1)

不,他们不等同。第一个查询有3个错误。 你有2个idSeller,idCar和idCustomer,在不指定表的情况下对这些进行引用,不明确。 您应该指定它们引用哪个表,就像在第二个查询中一样。

结果如下:

idSeller | idCar | idCustomer | idSeller | idCar | idCustomer

DBMS如何知道哪一个是idSeller,idCar和idCustomer?您需要指定他们来自哪个表。

答案 2 :(得分:0)

这两个查询不等价,因为在第一个你引用错误或不明确的列`ss.idSeller = idSeller AND s.idCar = idCar AND s.idCustomer = idCustomer;

如果您不使用正确的别名或表名,则无法进行正确的关联。 ..

如果表包含相同的列名但结果与您的数据没有正确关联且您希望重新开始

,则查询最终可能有效