考虑我尝试的以下查询,有两个表,Orders和Customers,每个表都有列名CustomerID,当我尝试显示这两个表时,只有一列在显示,我不明白为什么会这样,或者我理解的基本错误了。
SELECT Customers.CustomerID,Orders.CustomerID
FROM customers
inner JOIN orders
on customers.customerid=orders.customerid;
当我尝试只显示一列时,它显示的是很好的
SELECT Customers.CustomerID
FROM customers
inner JOIN orders
on customers.customerid=orders.customerid;
和
SELECT Customers.CustomerID
FROM customers
inner JOIN orders
on customers.customerid=orders.customerid;
所以我的问题是为什么我不能同时显示两者。
使用别名
SELECT Customers.CustomerID as customerid,Orders.CustomerID as ocustomerid
FROM customers
inner JOIN orders
on customers.customerid=orders.customerid;
您需要为每列定义一个别名:
SELECT Customers.CustomerID as customer_id, Orders.CustomerID as order_id
FROM customers
inner JOIN orders
on customers.customerid=orders.customerid;
这是一些查询接口的特性。你的第一个问题(我会这样写)是:
SELECT c.CustomerID, o.CustomerID
FROM customers c INNER JOIN
orders o
ON c.customerid = o.customerid;
这将返回两列,均命名为CustomerId
。一些查询接口坚持结果列在结果集中是唯一的。因此,结果会忽略具有相同名称的"后续"列。
您可以通过将查询用作子查询来获得这种风格:
SELECT x.*
FROM (SELECT c.CustomerID, o.CustomerID
FROM customers c INNER JOIN
orders o
ON c.customerid = o.customerid
) x;
这应该会返回一个错误,因为CustomerId
定义不正确。
需要记住的三点:
- 大多数数据库和查询接口都允许具有多个同名列的结果集
- 任何数据库都不允许在一个子查询中有多个具有相同名称的列
- 您知道如何通过分配列别名来解决此问题,这无论如何都是最佳做法