【问题标题】:Get distinct names order by last name按姓氏顺序获取不同的名称
【发布时间】:2018-07-06 22:02:35
【问题描述】:

我有以下 2 张桌子:

CREATE TABLE owner (
 id INT NOT NULL,
 first_name VARCHAR(20) NOT NULL,
 last_name VARCHAR(20) NOT NULL,
 PRIMARY KEY (id)
);

CREATE TABLE vehicle (
  id INT NOT NULL,
  owner_id INT NOT NULL, -- Foreign key to the owner table
  name VARCHAR(20) NOT NULL,
  color VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (id)
);

我正在尝试编写一个查询来查找拥有黑色车辆的所有车主的名字和姓氏,并按姓氏对车主进行排序,如果同一车主多次拥有彩色车辆,则仅显示一次姓名。

select first_name, last_name, count(v.id) 
  from owner o join vehicle v on o.id = v.owner_id
  where color = 'black' 
  group by first_name, last_name
  order by last_name;

我怎样才能避免车辆计数,然后获得唯一名称(名字,姓氏),结果按姓氏排序。

【问题讨论】:

  • 只需从您的查询中删除计数。

标签: sql oracle select


【解决方案1】:

可以说更优雅的解决方案是使用exists 运算符而不是加入:

SELECT   first_name, last_name
FROM     owner o
WHERE    EXISTS (SELECT *
                 FROM   vehicle v
                 WHERE  v.color = 'black' AND o.id = v.owner_id)
ORDER BY last_name ASC

【讨论】:

  • 使用SELECT '8' 或其他简单字符代替SELECT * 来提高性能。
  • @爱德华。 . .这对性能没有影响。子查询中的SELECT 表达式被忽略。
  • 这不是“可以说更优雅”。它比select distinctjoin 更好。
  • @Gordon Linoff,你知道的越多。是专门针对EXISTS() 函数的吗?
  • @爱德华。 . .是的,专门针对EXISTS,因为它正在检查是否存在行,而不是列。
【解决方案2】:

使用DISTINCT 运算符:

select DISTINCT first_name, last_name
  from owner o join vehicle v
    on o.id = v.owner_id
  where LOWER(color) = 'black' 
  order by last_name;

我还将它更改为查找'black',无论它是大写、小写还是混合大小写。

祝你好运。

【讨论】:

  • LOWER 不会影响 COLOR 列上的可能索引吗?
  • 在 LOWER(COLOR) 上创建基于函数的索引,例如CREATE INDEX LOWER_COLOR ON VEHICLE (LOWER(COLOR)).
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多