如何将查询结果显示为字符串的一部分?
How do I display my query results as part of a string?
我的数据库用于一个学校项目并处理各种 jobs/contracts 由顾问 运行 处理。很抱歉,如果上下文含糊不清,我们也没有真正得到太多。
我当前的代码按照预期的方式工作,它选择领导最多的顾问的名字和姓氏 contracts/jobs。但是我需要以特定格式显示结果。
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
但是我需要将结果显示为 "The consultant who has led the most contracts is: 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 - 你只是把它放在那里因为 LEFT JOIN 导致顾问行重复(每个顾问有多个合同)但是你也不需要左连接
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 returns 最活跃的合同线索 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
之所以可行,是因为按 name 分组实际上与按 id 分组相同:它计算合同 table 导致重复的次数。这有一个轻微的错误风险,尽管如果真的有两个不同的人同名,他们会将他们的合同加在一起。为了解决这个问题,您可以将 consultant_id 添加到分组依据 - 如果您正在分组依据,那么您不能使用分组依据中未提及的 SELECT 区域中的列(除非您将它们在聚合函数(如 min、max 等)中)但您可以将列放入组中,然后不要在 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
最后的学习点在这里;始终为您的 tables 添加别名(我使用 s 和 t)并使用别名。这可以防止您的查询在有人将新列添加到例如合同也称为 CONSULTANT_FNAME 时停止工作 - 如果没有别名,您的查询将仅在列名明确且数据库架构随时间变化时才有效
添加 table 别名还可以让您分两次加入一个 table,这可能很重要,例如一位顾问有一个 home_address_id 和一个 work_address_id,它们映射到地址 table 中的两个不同行。如果您使用 home_address_id = address.id OR work_address_id = address.id
仅加入一次地址,那么当数据作为一行更有用时,您最终会得到两行。 sql 101 到此结束 :) 但如果您对此信息有更多疑问,请参阅 When to use SQL Table Alias
我的数据库用于一个学校项目并处理各种 jobs/contracts 由顾问 运行 处理。很抱歉,如果上下文含糊不清,我们也没有真正得到太多。
我当前的代码按照预期的方式工作,它选择领导最多的顾问的名字和姓氏 contracts/jobs。但是我需要以特定格式显示结果。
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
但是我需要将结果显示为 "The consultant who has led the most contracts is: 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 - 你只是把它放在那里因为 LEFT JOIN 导致顾问行重复(每个顾问有多个合同)但是你也不需要左连接
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 returns 最活跃的合同线索 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
之所以可行,是因为按 name 分组实际上与按 id 分组相同:它计算合同 table 导致重复的次数。这有一个轻微的错误风险,尽管如果真的有两个不同的人同名,他们会将他们的合同加在一起。为了解决这个问题,您可以将 consultant_id 添加到分组依据 - 如果您正在分组依据,那么您不能使用分组依据中未提及的 SELECT 区域中的列(除非您将它们在聚合函数(如 min、max 等)中)但您可以将列放入组中,然后不要在 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
最后的学习点在这里;始终为您的 tables 添加别名(我使用 s 和 t)并使用别名。这可以防止您的查询在有人将新列添加到例如合同也称为 CONSULTANT_FNAME 时停止工作 - 如果没有别名,您的查询将仅在列名明确且数据库架构随时间变化时才有效
添加 table 别名还可以让您分两次加入一个 table,这可能很重要,例如一位顾问有一个 home_address_id 和一个 work_address_id,它们映射到地址 table 中的两个不同行。如果您使用 home_address_id = address.id OR work_address_id = address.id
仅加入一次地址,那么当数据作为一行更有用时,您最终会得到两行。 sql 101 到此结束 :) 但如果您对此信息有更多疑问,请参阅 When to use SQL Table Alias