首页 > 解决方案 > SQL GROUP BY 并为每个 GROUP 创建元素

问题描述

更新: 我能够解决这个问题INSERT INTO

INSERT INTO newClass
FROM
    SELECT newClassID AS id, newClassName AS name
    FROM oldClass
GROUP BY newClassID

我将 SQL 与 Orient DB 2.2 版一起使用。我想按属性对一个类的元素进行分组newClassID(这个类中有多个元素共享newClassID,假设我在第一类中有 20 个元素和 3 个唯一元素newClassID)。每个组都将具有独特性newClassID,并且newClassName这些属性齐头并进。对于每个组,我想创建另一个类 ( newClass) 的元素,该元素将具有id = newClassID and name = newClassName. 在上述情况下,这将导致newClass.

第一类的 Elelemt 看起来像:

元素 新类ID 新类名
1 id1 名称1
2 id2 名称2
3 id1 名称1
4 id3 名称3
5 id2 名称2

我想在新类中创建 3 个新元素:

元素 ID 姓名
1 id1 名称1
2 id2 名称2
3 id3 名称3

通过这个查询,我得到 id 和 name 作为属性:

BEGIN
    let pattern = SELECT newClassID, newClassName
                  FROM oldClass GROUP BY newClassID
COMMIT
RETURN { 'id' : $pattern.newClassID, 'name' : $pattern.newClassName }

结果:

[
    {
        "@type": "d",
        "@version": 0,
        "name": [
            "name1",
            "name2",
            "name3"
        ],
        "id": [
            "id1",
            "id2",
            "id3"
        ],
        "@fieldTypes": "name=e,id=e"
    }
]

现在我想调用这个函数(称为GetNewClass())并为 id a 中的每个条目创建newClassElement。我不能使用FOREACH,因为这仅适用于 3.x 版本。老实说:在这里我不知道如何做到这一点..

我试过了:

BEGIN
INSERT INTO newClass FROM SELECT GetNewClass()
let newElements = SELECT FROM newClass
RETURN $newElements 

但这给了我一个元素:

[
    {
        "@type": "d",
        "@rid": "#41:1",
        "@version": 1,
        "@class": "newClass",
        "GetProdID": {
            "name": [
                "name1",
                "name2",
                "name3"
            ],
            "id": [
                "id1",
                "id2",
                "id3"
            ]
        }
    }
]

非常感谢!

标签: sqlgroup-bysql-insertorientdb

解决方案


推荐阅读