Sql 如何将查询结果显示为字符串的一部分?

Sql 如何将查询结果显示为字符串的一部分?,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我的数据库用于一个学校项目,处理由顾问管理的各种工作/合同。道歉如果上下文含糊不清,我们也没有得到太多 我当前的代码与预期的一样,它选择了负责大多数合同/工作的顾问的名字和姓氏。但是,我需要以特定的格式显示结果 SELECT DISTINCT CONSULTANT_FNAME, CONSULTANT_SNAME FROM CONSULTANT LEFT JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD WHERE CONTRACT_LEAD IN( S

我的数据库用于一个学校项目,处理由顾问管理的各种工作/合同。道歉如果上下文含糊不清,我们也没有得到太多

我当前的代码与预期的一样,它选择了负责大多数合同/工作的顾问的名字和姓氏。但是,我需要以特定的格式显示结果

SELECT DISTINCT CONSULTANT_FNAME, CONSULTANT_SNAME
FROM CONSULTANT LEFT JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
WHERE CONTRACT_LEAD IN(
SELECT CONTRACT_LEAD
FROM CONTRACT
GROUP BY CONTRACT_LEAD
ORDER BY COUNT(CONTRACT_LEAD) DESC
FETCH NEXT 1 ROWS ONLY);
目前我得到的结果是:

CONSULTANT_FNAME     CONSULTANT_SNAME
-------------------- --------------------
Cloud                Strife

但是,我需要将结果显示为“领导最多合同的顾问是:云冲突”。

您可以使用下面的查询-

SELECT DISTINCT 'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM CONSULTANT LEFT JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
WHERE CONTRACT_LEAD IN(SELECT CONTRACT_LEAD
                       FROM CONTRACT
                       GROUP BY CONTRACT_LEAD
                       ORDER BY COUNT(CONTRACT_LEAD) DESC
                       FETCH NEXT 1 ROWS ONLY);

您不应该需要DISTINCT—您只需要将其放在那里,因为左连接会导致顾问行重复(每个顾问有多个合同),但您也不需要左连接

SELECT 
  'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM CONSULTANT 
WHERE CONSULTANT_ID IN(
  SELECT CONTRACT_LEAD
  FROM CONTRACT
  GROUP BY CONTRACT_LEAD
  ORDER BY COUNT(CONTRACT_LEAD) DESC
  FETCH NEXT 1 ROWS ONLY
)
IN中的子查询返回最活跃的合同负责人id,但这与顾问id相同-您不需要加入

我相信你也可以这样做:

SELECT 
  'The consultant who has led the most contracts is: ' || CONSULTANT_FNAME || ' ' || CONSULTANT_SNAME
FROM 
  CONSULTANT 
  INNER JOIN CONTRACT ON CONSULTANT_ID = CONTRACT_LEAD
GROUP BY CONSULTANT_FNAME, CONSULTANT_SNAME
ORDER BY COUNT(*) DESC
FETCH NEXT 1 ROWS ONLY
之所以这样做,是因为按名称分组实际上与按id分组是相同的:它给出了契约表导致重复的次数计数。不过,如果真的有两个名字相同的人,他们的合同就会加在一起,这会有一点bug风险。要解决这一问题,您可以将consultant_id添加到group by-如果您正在执行group by,则您不能在group by中使用group by中未提及的列(除非您将这些列放在聚合函数(如min、max等)中,但您可以在group by中放置您在SELECT中不使用的列。通过添加ID,我们提供了一种方法,可以告诉两位姓名相同的咨询师,不要将他们的分数加在一起:

SELECT 
  'The consultant who has led the most contracts is: ' || s.CONSULTANT_FNAME || ' ' || s.CONSULTANT_SNAME
FROM 
  CONSULTANT s
  INNER JOIN CONTRACT t ON s.CONSULTANT_ID = t.CONTRACT_LEAD
GROUP BY s.CONSULTANT_FNAME, s.CONSULTANT_SNAME, s.CONSULTANT_ID
ORDER BY COUNT(*) DESC
FETCH NEXT 1 ROWS ONLY
这里是最后的学习点;始终为表添加别名(我使用s和t)并使用别名。如果有人向eg contracts(也称为CONSULTANT_FNAME)中添加了一个新列,这将防止您的查询停止工作-如果没有别名,您的查询将仅在列名明确且db schema确实随时间变化时才起作用


添加表别名还可以让您两次联接一个表,如果顾问有一个家庭地址id和一个工作地址id,并且映射到地址表中的两个不同行,这一点非常重要。如果只使用
home\u address\u id=address.id或work\u address\u id=address.id
将地址加入一次,那么当数据作为一行更可用时,您将得到两行。sql 101:)到此结束,但如果您对这一信息宝库有更多问题,请参见

提示:
CONCAT()
。感谢您的回复!不幸的是,我得到了这个错误:错误在第1行:ORA-00909:无效的arguments@N26916,这是Oracle错误,您已经标记了有问题的MySQL。您实际上使用的是哪种数据库管理系统?感谢您对如何改进我的代码的回复和建议,我对SQL还是很陌生。但是,这两个查询都返回以下错误消息:第2行错误:ORA-00909:arguments的数量无效。我想oracle还没有赶上世界上其他地方,提供了一个接受N个参数并将它们全部连接在一起的CONCAT版本,换成了专有的| |字符串连接形式。甲骨文的concat只需要一对,这意味着它必须被反复链接,这使得查询变得混乱。有趣的当我第一次看CONCAT时,我可以发誓这不是一个oracle问题,但如果您使用的是非oracle的,那么在其他dbms中,使用CONCAT字符串通常比使用+更有用,因为对于eh SQL Server,如果字符串中的任何内容CONCAT为空,如果使用+,则整个字符串将变为null;如果使用concat()函数,则整个字符串将变为null。在oracle中,没有导致空值的字符串| | null