我有一個processknowledgeentry包含以下資料的表:
pke_id prc_id knw_id
1 1 2
2 1 4
3 2 4
該列knw_id參考另一個名為 的表knowledge,該表也有自己的 id 列。我希望能夠選擇所有knw_id具有相同 的值prc_id,并讓它們保留其作為 id 的性質(以便它保持對knowledge表的可參考性)。
期望的結果:
prc_id knw_ids
1 [2, 4]
我的代碼如下所示。(它還從另一個process通過內部連接prc_ids呼叫的表中選擇一個行程名稱。該部分至少可以正常作業。)
SELECT * FROM (
SELECT
p.prc_name,
(SELECT knw_id
FROM processknowledgeentry
GROUP BY knw_id
HAVING COUNT(*) > 1)
FROM processknowledgeentry pke
INNER JOIN process p
ON pke.prc_id=p.prc_id
WHERE pke.prc_id = %s) as temp
我收到錯誤訊息:“ CardinalityViolation: more than one row returned by a subquery used as an expression ”,并且我理解錯誤存在的原因,所以我想知道如何解決它。我也不確定我的邏輯是否正確。
將不勝感激任何幫助,謝謝!
uj5u.com熱心網友回復:
似乎您需要一個STRING_AGG()函式而不是GROUP_CONCAT()其他一些 DBMS 具有的函式,其中包含一個字串型別引數作為第一個引數以及 HAVING 子句,該子句過濾多個prc_id值,例如
SELECT p.prc_id, STRING_AGG(knw_id::TEXT,',') AS knw_ids
FROM processknowledgeentry pke
JOIN process p
ON pke.prc_id = p.prc_id
-- WHERE pke.prc_id = %s
GROUP BY p.prc_id
HAVING COUNT(pke.prc_id) > 1
實際上,在這種情況下,不需要 WHERE 子句。
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406857.html
標籤:
