我正在处理一个应该从CONCENTRATOR
表返回所有行的查询。但是,必须按所有集中器的列以及部门名称和类型名称对其进行排序。
以下是集中器栏目:
CONCENTRATOR_ID
NAME
INTERNALADDRESS
TYPE_ID
DEPARTMENT_ID
TYPE_ID
和DEPARTMENT_ID
分别与DEPARTMENT
表和TYPE
表相关联,同时包含NAME
列。
以下是限制因素:
要恢复,我需要在集中器列上SELECT *
和DISTINCT department.name
之类的东西,但似乎很复杂......我尝试了很多请求,但找不到任何工作。
请问有人帮帮我吗?
我正在寻找的请求应该是这样的:
SELECT DISTINCT d.NAME as "department.name", t.NAME as "type.name", *
FROM "CONCENTRATOR" c
LEFT OUTER JOIN "CONCENTRATOR_GROUP" USING(CONCENTRATOR_ID)
LEFT OUTER JOIN "GROUP" g USING(GROUP_ID)
LEFT OUTER JOIN "TYPE" t USING(TYPE_ID)
LEFT OUTER JOIN "DEPARTMENT" d USING(DEPARTMENT_ID)
ORDER BY TRIM(UPPER(c.name)) ASC
答案 0 :(得分:1)
这里有几点需要注意。我真的不喜欢"自然联合"因为他们只是在我看来伪装有用的细节,所以我没有使用过它们。我不得不假设桌子" GROUP"通过CONCENTRATOR_GROUP加入一个缺少详细信息的示例。
表名" GROUP"并不是一个好主意,因为它是一个非常常用的保留字。我不建议使用这样的单词作为表名。由于这个" GROUP"被引用(在我的经验中引用对象名称是不正常的)。
你谈论" distinct"好像它有一些神奇的品质,我应该直观地理解。它没有,我也没有。让我们说只有两个部门也是" distinct"
DEPTX DeptY
所以现在让我们假设有2个集中器,这两个集中器都是"不同的"太:
ConcenA ConcenB
两个集中器都在两个部门中使用,因此我们生成此查询:
select distinct
c.name as c_name, d.name as d_name
from concentrators c
inner join departments d on c.dept_id=d.dept_id
The result is:
ConcenA DeptX
ConcenB DeptX
ConcenA DeptY
ConcenB DeptY
所有4行都是"不同的"
重点是"选择不同的"是一个"行运算符",即它考虑整行来确定该行的任何部分是否与所有其他行不同。选择不同的"没有任何细微之处或选项,它总是以相同的方式工作(在整个行上)。因此,考虑到这一点,我们现在知道"选择不同的"简直不是一种正确的技术(由于技术定义不同,你也可能感觉它不是描述问题的好方法)。
因此,"选择不同的"通常,人们可以将这些技术转变为技术:" group by"或" row_number()" 因为这些做给了我们细微之处和选择。
现在你还没有解释为什么或如何选择一个部门(事实上,对我而言,你会选择一个部分听起来很奇怪)但是我在下面提供一种方式使用row_number()和"微妙的"来做到这一点正在使用的是ORDER BY,它按字母顺序给第一个部门名称1,所有其他部门得到1以上;并且这发生在每个 CONCENTRATOR_ID上,因为row_number()是"由"分隔。那个领域。
SELECT
department_name
, type_name
, NAME
, CONCENTRATOR_ID
, INTERNALADDRESS
, TYPE_ID
, DEPARTMENT_ID
FROM (
SELECT
d.NAME AS department_name
, t.NAME AS type_name
, c.CONCENTRATOR_ID
, c.NAME
, c.INTERNALADDRESS
, c.TYPE_ID
, c.DEPARTMENT_ID
, ROW_NUMBER() OVER (PARTITION BY c.CONCENTRATOR_ID
ORDER BY d.NAME, t.NAME, c.NAME) AS RN
FROM CONCENTRATOR c
LEFT OUTER JOIN CONCENTRATOR_GROUP cg
ON c.CONCENTRATOR_ID = cg.CONCENTRATOR_ID
LEFT OUTER JOIN "GROUP" g
ON cg.GROUP_ID = g.GROUP_ID
LEFT OUTER JOIN TYPE t
ON c.TYPE_ID = t.TYPE_ID
LEFT OUTER JOIN DEPARTMENT d
ON c.DEPARTMENT_ID = c.DEPARTMENT_ID
) sq
WHERE RN = 1 /* HERE is where we restrict output to one department per concentrator */
ORDER BY
NAME ASC
, CONCENTRATOR_ID
;
我没有理由改变连接类型,因为你可以看到它们仍然是左外连接 - 但我怀疑可能没有合理的理由全部或部分这些。如果可以,请使用更高效的INNER JOIN。