SQL加入性能注意事项

时间:2017-10-10 10:59:39

标签: mysql

我正在寻找更好的方法来实现使用Query 2实现的结果2.简单来说,我正在尝试将File和CD列合并为每个SalesDetailId的单行。很明显,查询2并不是性能的理想选择。查询1和结果1是我开始使用的,它显示了我正在使用的数据结构类型。

查询1:

SELECT 
  SDT.SalesDetailId,
  RlFile.Code AS FILE,
  RlCD.Code AS CD
FROM SalesDetail SDT
INNER JOIN Sales S
  ON S.SalesID = SDT.SalesID
LEFT JOIN SalesReflookup SRL 
    ON SRL.SalesID = S.SalesID AND SRL.RefLookupTypeId IN (30,200)  
LEFT JOIN reflookup.reflookup RlFileStatus 
    ON RlFileStatus.reflookupid = SRL.reflookupid AND RlFile.reflookuptypeid = 30
LEFT JOIN reflookup.reflookup RlCatastrophe 
    ON RlCD.reflookupid = SRL.reflookupid AND RlCatastrophe.reflookuptypeid = 200
WHERE 
    SDT.SalesDetailId = 4042910

结果1:

| SalesDetailId | FILE |  CD  |
|       4042910 | C    | NULL |
|       4042910 | NULL | 95E  |

查询2:

SELECT 
  SDT.SalesDetailId,
  FILE.Code AS FILE,
  CD.Code AS CD
FROM SalesDetail SDT
INNER JOIN Sales S
  ON S.SalesID = SDT.SalesID
LEFT JOIN (SELECT
          RL.code,SRL.SalesID
          FROM reflookup.reflookup RL
          INNER JOIN SalesReflookup SRL 
            ON RL.reflookupid = SRL.reflookupid AND RL.reflookuptypeid = 30) FILE ON FILE.SalesID = S.SalesID
LEFT JOIN (SELECT
          RL.code,SRL.SalesID
          FROM reflookup.reflookup RL
          INNER JOIN SalesReflookup SRL 
            ON RL.reflookupid = SRL.reflookupid AND RL.reflookuptypeid = 200) CD ON CD.SalesID = S.SalesID

WHERE SDT.SalesDetailId = 4042910

结果2(期望结果)

| SalesDetailId | FILE | CD |
|       4042910 | C           | 95E            |

1 个答案:

答案 0 :(得分:2)

您可以在第一个查询中使用GROUP BY

SELECT SDT.SalesDetailId,
       MAX(RlFile.Code) AS FILE,
       MAX(RlCD.Code) AS CD
FROM . . .
WHERE  SDT.SalesDetailId = 4042910
GROPU BY SDT.SalesDetailId;