如何从INNER JOINed表中有效选择汇总SUM值?

时间:2020-08-24 18:23:24

标签: sql sql-server

我有一个带有状态列的子表。当我从父表中选择列时,我还要报告基于子表中所有相关行的计算状态。状态的计算非常简单:如果相关子表行中的所有状态均为0,则查询中的状态将设置为0。否则,状态将设置为非零值(实际值是)。

我对查询的实现(如下所示)在相关的子行上使用SUM()。这种方法很好用。但是,由于SUM()的原因,我需要对从另外两个表中选择的所有列进行GROUP BY。

有更好的方法吗?按这么多列分组时,我应该担心性能吗?

样本中省略了Btw,键,索引和关系。

示例表和存储过程:

function createGrid(rows, cols) {
    let mousePressed = false;
    let wordsFound = 0;
    let selectedText = '';
    let selectedCells = [];
    let variables = [];
    grid.style.setProperty('--grid-rows', rows);
    grid.style.setProperty('--grid-cols', cols);
    for (var row = 0; row < rows; row++) {
        for (var column = 0; column < cols; column++) {
            let cell = document.createElement('div');
            cell.innerText = randomChoice(alphabet);
            cell.id = `${column} ${row}`;
            cell.onmousedown = function() {
                console.log(cell)
                console.log(selectedText)
                variables = mouseDown(cell, selectedText, selectedCells);
                selectedText = variables[0];
                selectedCells = variables[1];
                mousePressed = variables[2];
            }
            cell.onmouseover = function() {
                variables = mouseOver();
                selectedText = variables[0];
                selectedCells = variables[1];
            }
            cell.onmouseup = function() {
                variables = mouseUp(cell, selectedText, selectedCells);
                selectedText = variables[0];
                selectedCells = variables[1];
                mousePressed = variables[2];
            }
            grid.appendChild(cell).className = 'grid-item';
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您可能会发现使用相关子查询可以提供更好的性能:

SELECT c.Name, c.PhoneNumber, o.OrderId, o.Description1, o.Description2, o.Description3,
       o.[Date], o.Amount, o.[RecommendedBy]
       (SELECT SUM(i.Status)
        FROM OrderItem i
        WHERE i.OrderId = o.OrderId
       ) AS [ItemStatus]
FROM [Order] o JOIN
     [Customer] c
     ON c.CustomerId = o.CustomerId     
WHERE o.CustomerId = @CustomerId;

使用如此少量的数据(单个客户),这可能不会对性能产生很大的影响,但是查询更易于维护。