2016-12-21 7 views
0

でグループごとに1つのレコードを取得します。例についてはNode.jsのはORACLEDB - 私は多くの関係1で、2つのテーブルを結合するためにNode.jsのとORACLEDBを使用していアレー

RECORDS Table: 
RECORD_ID COMMENTS 
1000  Comment 1 
1001  Comment 2 

DEVICE表:

DEVICE_ID REF_RECORD_ID DEVICE_NAME 
2000  1000   iPhone 6 
2001  1000   iPhone 7 
2003  1001   Samsung Galaxy S6 
2004  1001   Samsung Galaxy S7 

私は

SELECT A.RECORD_ID, A.COMMENT, B.DEVICE_ID, B.DEVICE_NAME FROM RECORDS A, DEVICES B WHERE A.RECORD_ID = B.REF_RECORD_ID; 

現在の結果使用して参加取り出すことができます。

[{ 
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6" 
}, 
{ 
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7" 
}, 
{ 
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6" 
}, 
{ 
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7" 
}] 

しかし、以下に示すように、私は結果を希望:

[{ 
    RECORD_ID: 1000, COMMENT: "Comment 1", 
    DEVICES: [{ DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6" }, { DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7" }] 
}, 
{ 
    RECORD_ID: 1001, COMMENT: "Comment 2", 
    DEVICES: [{ DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6" }, { DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7" }] 
}] 

ではなく、オブジェクトの配列をループして、重複したRECORD_IDのを見つけると、サブアイテムをプッシュする配列を作成するよりも、これを行うには良い方法はありますか?

答えて

0

ネストされたカーソル式がサポートされる場合、指定した出力を直接行うことができます。ここでは、結果セットを取得したら、Node.jsの中でこれを行うことができますいくつかのコードの例ですが、その間に https://github.com/oracle/node-oracledb/issues/565

var resultRowsIdx; 
var resultRows = [{ 
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6" 
}, 
{ 
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7" 
}, 
{ 
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6" 
}, 
{ 
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7" 
}]; 
var records = []; 
var recordsMap = {}; 
var currentRecordId; 

for (resultRowsIdx = 0; resultRowsIdx < resultRows.length; resultRowsIdx += 1) { 
    currentRecordId = resultRows[resultRowsIdx].RECORD_ID; 

    if (!recordsMap[currentRecordId]) { 
    recordsMap[currentRecordId] = {}; 
    recordsMap[currentRecordId].RECORD_ID = currentRecordId; 
    recordsMap[currentRecordId].COMMENT = resultRows[resultRowsIdx].COMMENT; 
    recordsMap[currentRecordId].DEVICES = []; 

    records.push(recordsMap[currentRecordId]); 
    } 

    recordsMap[currentRecordId].DEVICES.push({ 
    DEVICE_ID: resultRows[resultRowsIdx].DEVICE_ID, 
    DEVICE_NAME: resultRows[resultRowsIdx].DEVICE_NAME 
    }); 
} 

console.log(records); 
あなたは他の人がここで同じものを探していることがわかります
関連する問題