聚合不重复
Aggregate without duplicates
我在这里进行的是:
Table 1: AOC_Model
AOC_ID int (Primary Key)
Model varchar(50)
Table 2: AOC_Chipset
AOC_CHIPSET_ID int (Primary Key)
CONTROLLER_ID int
CHIPSET_ID int
AOC_ID int
Table3:控制器
CONTROLLER_ID int (Primary Key)
CONTROLLER varchar(10)
Table 4: 芯片组
CONTROLLER_ID int (Primary Key)
CHIPSET_ID int (Primary Key)
CHIPSET varchar(50)
Table 5: Notes_Chipset
NOTES_CHIPSET_ID int (Primary Key)
CONTROLLER_ID int
CHIPSET_ID int
DATE date
NOTES varchar(800)
首先我有一个芯片组 table 通过 Controller_ID 连接到控制器
然后我有 AOC_Chipset,它实际上充当控制器和芯片组之间的连接 table。 AOC_Chipset 通过 Controller_ID 和 Chipset_id 连接到芯片组
然后我有 Notes_Chipset 也通过 Controller_ID 和 Chipset_id 连接到芯片组
最后,我有 AOC_Model 通过 AOC_ID
连接到 AOC_Chipset
我在这里有很多对很多关系。
我可以将一两个控制器分配给同一个 AOC_ID。
我可以将一两个芯片组分配给同一个控制器。
我可以将多个笔记分配给同一个芯片组。
我在 SQL Server 2019 中创建了这个查询:
SELECT
dbo.AOC_CHIPSET.AOC_ID,
string_agg(dbo.CONTROLLER.CONTROLLER, ', ') AS vControllers,
string_agg(dbo.CHIPSET.CHIPSET, ', ') AS vChipsets,
string_agg(dbo.NOTES_CHIPSET.DATE, ', ') AS vDate,
string_agg(dbo.NOTES_CHIPSET.NOTES, ', ') AS vNotes
FROM
dbo.AOC_CHIPSET
INNER JOIN
dbo.CHIPSET ON dbo.AOC_CHIPSET.CONTROLLER_ID = dbo.CHIPSET.CONTROLLER_ID
AND dbo.AOC_CHIPSET.CHIPSET_ID = dbo.CHIPSET.CHIPSET_ID
INNER JOIN
dbo.CONTROLLER ON dbo.CHIPSET.CONTROLLER_ID = dbo.CONTROLLER.CONTROLLER_ID
INNER JOIN
dbo.NOTES_CHIPSET ON dbo.CHIPSET.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
AND dbo.CHIPSET.CHIPSET_ID = dbo.NOTES_CHIPSET.CHIPSET_ID
AND dbo.CONTROLLER.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
GROUP BY
dbo.AOC_CHIPSET.AOC_ID
问题是结果包含重复项
我知道我可以使用 DISTINCT
,但我不知道在哪里/如何将它与 string_agg
一起使用?
我不完全理解这个查询的 purpose/use 是什么,如果这没有帮助,请原谅我。但是我认为 DISTINCT 对您没有多大用处,因为您的 AOC_ID 在重复数据的每一行中都是唯一值。如果你摆脱了 AOC_ID,那么你可以使用 DISTINCT 而不必担心该数据出现两次。但同样,如果摆脱此查询中的 AOC_ID 不是一个选项,我和你一样难过。
SELECT MAX(AOC_ID) as AOC_ID, vControllers, vChipsets, vDate, vNotes FROM
(
SELECT
dbo.AOC_CHIPSET.AOC_ID,
string_agg(dbo.CONTROLLER.CONTROLLER, ', ') AS vControllers,
string_agg(dbo.CHIPSET.CHIPSET, ', ') AS vChipsets,
string_agg(dbo.NOTES_CHIPSET.DATE, ', ') AS vDate,
string_agg(dbo.NOTES_CHIPSET.NOTES, ', ') AS vNotes
FROM
dbo.AOC_CHIPSET
INNER JOIN
dbo.CHIPSET ON dbo.AOC_CHIPSET.CONTROLLER_ID = dbo.CHIPSET.CONTROLLER_ID
AND dbo.AOC_CHIPSET.CHIPSET_ID = dbo.CHIPSET.CHIPSET_ID
INNER JOIN
dbo.CONTROLLER ON dbo.CHIPSET.CONTROLLER_ID = dbo.CONTROLLER.CONTROLLER_ID
INNER JOIN
dbo.NOTES_CHIPSET ON dbo.CHIPSET.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
AND dbo.CHIPSET.CHIPSET_ID = dbo.NOTES_CHIPSET.CHIPSET_ID
AND dbo.CONTROLLER.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
GROUP BY
dbo.AOC_CHIPSET.AOC_ID
) R
GROUP BY vControllers, vChipsets, vDate, vNotes
我用直接放在 select 列表中的子 select 替换了连接。这允许我 select 每个检索到的不同值 属性。事实上,每个字符串总是有 2 个 sub-select 要创建。内层有 SELECT DISTINCT
,外层有 string_agg
。内部子 select 使用 WHERE 子句过滤其行,其中 AOC_ID
匹配主 SELECT
SELECT
ac.AOC_ID,
(SELECT string_agg(CONTROLLER, ', ') FROM
(SELECT DISTINCT CONTROLLER
FROM dbo.CONTROLLER co INNER JOIN dbo.AOC_CHIPSET ac1
ON ac1.CONTROLLER_ID = co.CONTROLLER_ID
WHERE ac1.AOC_ID = ac.AOC_ID) x) AS vControllers,
(SELECT string_agg(CHIPSET, ', ') FROM
(SELECT DISTINCT CHIPSET
FROM dbo.CHIPSET cs INNER JOIN dbo.AOC_CHIPSET ac2
ON ac2.CONTROLLER_ID = cs.CONTROLLER_ID AND ac2.CHIPSET_ID = cs.CHIPSET_ID
WHERE ac2.AOC_ID = ac.AOC_ID) y) AS vChipsets,
(SELECT string_agg([DATE], ', ') FROM
(SELECT DISTINCT [DATE]
FROM dbo.NOTES_CHIPSET nd INNER JOIN dbo.AOC_CHIPSET ac3
ON ac3.CONTROLLER_ID = nd.CONTROLLER_ID AND ac3.CHIPSET_ID = nd.CHIPSET_ID
WHERE ac3.AOC_ID = ac.AOC_ID) z) AS vDate,
(SELECT string_agg(NOTES, ', ') FROM
(SELECT DISTINCT NOTES
FROM dbo.NOTES_CHIPSET nd INNER JOIN dbo.AOC_CHIPSET ac4
ON ac4.CONTROLLER_ID = nd.CONTROLLER_ID AND ac4.CHIPSET_ID = nd.CHIPSET_ID
WHERE ac4.AOC_ID = ac.AOC_ID) z) AS vNotes
FROM
dbo.AOC_CHIPSET ac
GROUP BY
ac.AOC_ID
子查询中的 SELECT DISTINCT
有效,因为 select-list 不包含任何控制器或芯片组 ID。这对于外部级别的联接是不可能的,因为它们需要这些 ID。
我在这里进行的是:
Table 1: AOC_Model
AOC_ID int (Primary Key)
Model varchar(50)
Table 2: AOC_Chipset
AOC_CHIPSET_ID int (Primary Key)
CONTROLLER_ID int
CHIPSET_ID int
AOC_ID int
Table3:控制器
CONTROLLER_ID int (Primary Key)
CONTROLLER varchar(10)
Table 4: 芯片组
CONTROLLER_ID int (Primary Key)
CHIPSET_ID int (Primary Key)
CHIPSET varchar(50)
Table 5: Notes_Chipset
NOTES_CHIPSET_ID int (Primary Key)
CONTROLLER_ID int
CHIPSET_ID int
DATE date
NOTES varchar(800)
首先我有一个芯片组 table 通过 Controller_ID 连接到控制器 然后我有 AOC_Chipset,它实际上充当控制器和芯片组之间的连接 table。 AOC_Chipset 通过 Controller_ID 和 Chipset_id 连接到芯片组 然后我有 Notes_Chipset 也通过 Controller_ID 和 Chipset_id 连接到芯片组 最后,我有 AOC_Model 通过 AOC_ID
连接到 AOC_Chipset我在这里有很多对很多关系。 我可以将一两个控制器分配给同一个 AOC_ID。 我可以将一两个芯片组分配给同一个控制器。 我可以将多个笔记分配给同一个芯片组。
我在 SQL Server 2019 中创建了这个查询:
SELECT
dbo.AOC_CHIPSET.AOC_ID,
string_agg(dbo.CONTROLLER.CONTROLLER, ', ') AS vControllers,
string_agg(dbo.CHIPSET.CHIPSET, ', ') AS vChipsets,
string_agg(dbo.NOTES_CHIPSET.DATE, ', ') AS vDate,
string_agg(dbo.NOTES_CHIPSET.NOTES, ', ') AS vNotes
FROM
dbo.AOC_CHIPSET
INNER JOIN
dbo.CHIPSET ON dbo.AOC_CHIPSET.CONTROLLER_ID = dbo.CHIPSET.CONTROLLER_ID
AND dbo.AOC_CHIPSET.CHIPSET_ID = dbo.CHIPSET.CHIPSET_ID
INNER JOIN
dbo.CONTROLLER ON dbo.CHIPSET.CONTROLLER_ID = dbo.CONTROLLER.CONTROLLER_ID
INNER JOIN
dbo.NOTES_CHIPSET ON dbo.CHIPSET.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
AND dbo.CHIPSET.CHIPSET_ID = dbo.NOTES_CHIPSET.CHIPSET_ID
AND dbo.CONTROLLER.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
GROUP BY
dbo.AOC_CHIPSET.AOC_ID
问题是结果包含重复项
我知道我可以使用 DISTINCT
,但我不知道在哪里/如何将它与 string_agg
一起使用?
我不完全理解这个查询的 purpose/use 是什么,如果这没有帮助,请原谅我。但是我认为 DISTINCT 对您没有多大用处,因为您的 AOC_ID 在重复数据的每一行中都是唯一值。如果你摆脱了 AOC_ID,那么你可以使用 DISTINCT 而不必担心该数据出现两次。但同样,如果摆脱此查询中的 AOC_ID 不是一个选项,我和你一样难过。
SELECT MAX(AOC_ID) as AOC_ID, vControllers, vChipsets, vDate, vNotes FROM
(
SELECT
dbo.AOC_CHIPSET.AOC_ID,
string_agg(dbo.CONTROLLER.CONTROLLER, ', ') AS vControllers,
string_agg(dbo.CHIPSET.CHIPSET, ', ') AS vChipsets,
string_agg(dbo.NOTES_CHIPSET.DATE, ', ') AS vDate,
string_agg(dbo.NOTES_CHIPSET.NOTES, ', ') AS vNotes
FROM
dbo.AOC_CHIPSET
INNER JOIN
dbo.CHIPSET ON dbo.AOC_CHIPSET.CONTROLLER_ID = dbo.CHIPSET.CONTROLLER_ID
AND dbo.AOC_CHIPSET.CHIPSET_ID = dbo.CHIPSET.CHIPSET_ID
INNER JOIN
dbo.CONTROLLER ON dbo.CHIPSET.CONTROLLER_ID = dbo.CONTROLLER.CONTROLLER_ID
INNER JOIN
dbo.NOTES_CHIPSET ON dbo.CHIPSET.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
AND dbo.CHIPSET.CHIPSET_ID = dbo.NOTES_CHIPSET.CHIPSET_ID
AND dbo.CONTROLLER.CONTROLLER_ID = dbo.NOTES_CHIPSET.CONTROLLER_ID
GROUP BY
dbo.AOC_CHIPSET.AOC_ID
) R
GROUP BY vControllers, vChipsets, vDate, vNotes
我用直接放在 select 列表中的子 select 替换了连接。这允许我 select 每个检索到的不同值 属性。事实上,每个字符串总是有 2 个 sub-select 要创建。内层有 SELECT DISTINCT
,外层有 string_agg
。内部子 select 使用 WHERE 子句过滤其行,其中 AOC_ID
匹配主 SELECT
SELECT
ac.AOC_ID,
(SELECT string_agg(CONTROLLER, ', ') FROM
(SELECT DISTINCT CONTROLLER
FROM dbo.CONTROLLER co INNER JOIN dbo.AOC_CHIPSET ac1
ON ac1.CONTROLLER_ID = co.CONTROLLER_ID
WHERE ac1.AOC_ID = ac.AOC_ID) x) AS vControllers,
(SELECT string_agg(CHIPSET, ', ') FROM
(SELECT DISTINCT CHIPSET
FROM dbo.CHIPSET cs INNER JOIN dbo.AOC_CHIPSET ac2
ON ac2.CONTROLLER_ID = cs.CONTROLLER_ID AND ac2.CHIPSET_ID = cs.CHIPSET_ID
WHERE ac2.AOC_ID = ac.AOC_ID) y) AS vChipsets,
(SELECT string_agg([DATE], ', ') FROM
(SELECT DISTINCT [DATE]
FROM dbo.NOTES_CHIPSET nd INNER JOIN dbo.AOC_CHIPSET ac3
ON ac3.CONTROLLER_ID = nd.CONTROLLER_ID AND ac3.CHIPSET_ID = nd.CHIPSET_ID
WHERE ac3.AOC_ID = ac.AOC_ID) z) AS vDate,
(SELECT string_agg(NOTES, ', ') FROM
(SELECT DISTINCT NOTES
FROM dbo.NOTES_CHIPSET nd INNER JOIN dbo.AOC_CHIPSET ac4
ON ac4.CONTROLLER_ID = nd.CONTROLLER_ID AND ac4.CHIPSET_ID = nd.CHIPSET_ID
WHERE ac4.AOC_ID = ac.AOC_ID) z) AS vNotes
FROM
dbo.AOC_CHIPSET ac
GROUP BY
ac.AOC_ID
子查询中的 SELECT DISTINCT
有效,因为 select-list 不包含任何控制器或芯片组 ID。这对于外部级别的联接是不可能的,因为它们需要这些 ID。