Sql 按姓氏顺序获取不同的名称

Sql 按姓氏顺序获取不同的名称,sql,oracle,select,Sql,Oracle,Select,我有以下两个表格: 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 VARC

我有以下两个表格:

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;

在这里,我如何避免计算车辆数量,然后再使用按姓氏排序的结果获得唯一的名称(名字、姓氏)。

一个可能更优雅的解决方案是使用
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

一个可能更优雅的解决方案是使用
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

使用
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”
,不管它是大写、小写还是混合大写


祝你好运。

使用
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”
,不管它是大写、小写还是混合大写


祝您好运。

使用
选择“8”
或其他简单字符,而不是
选择*
,以提高性能。@Edward。这对性能没有影响。子查询中的
SELECT
表达式被忽略。这并不是“可以说更优雅”。它比@Gordon Linoff使用
join
选择distinct要好,你知道的越多。这是针对
EXISTS()
函数的吗?@Edward。是的,特别是针对
EXISTS
,因为它正在检查是否存在行而不是列。使用
选择“8”
或其他简单字符,而不是
选择*
,以提高性能。@Edward。这对性能没有影响。子查询中的
SELECT
表达式被忽略。这并不是“可以说更优雅”。它比@Gordon Linoff使用
join
选择distinct要好,你知道的越多。这是针对
EXISTS()
函数的吗?@Edward。是的,特别是对于
EXISTS
,因为它正在检查行而不是列的存在。只需从查询中删除count。只需从查询中删除count。LOWER不会影响颜色列上可能的索引吗?基于LOWER(颜色)创建一个函数,例如
在车辆上创建索引LOWER\u COLOR(LOWER(COLOR))
。LOWER不会影响颜色列上可能的索引吗?创建一个基于LOWER(颜色)的函数索引,例如
在车辆上创建索引LOWER\u颜色(颜色)(颜色)(LOWER(颜色))