0

I have a form that contains many records ,If I click on a record another form should be appear with detail of that previous record.In the second form I have many Textfield that fill from these Long query:

  SELECT tb_bauteile.*, tb_bauteile.CDT AS CdtNr, tb_Fahrzeug.ID, tb_Pinnummern.Pin,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS KS_Plus,

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CDT_Plus, 

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS Pfad_Plus, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS UPfad_Plus,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS KS_Minus, 

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS CDT_Minus,

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS Pfad_Minus,

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS UPfad_Minus,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS Unterbr,

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS CDT_Unterbr,

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS Pfad_Unterbr, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS UPfad_Unterbr, 

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS CDT_Aderschl, 

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Pfad_Aderschl, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS UPfad_Aderschl,

    (SELECT Fehlercodes_akt_Liste.F_Klasse_EU from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CLA_EU,

    (SELECT Fehlercodes_akt_Liste.F_Klasse_US from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CLA_US

    FROM (tb_Pinnummern INNER JOIN tb_Fahrzeug ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG) INNER JOIN tb_bauteile ON tb_Pinnummern.Bauteil = tb_bauteile.ID
    WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id]));

and this form is very slow and I want to make it better,i put Index on necessary field ,It made the time less than before but slow

I tought that I can put each query on each textfield(in controlelementcontent) i.e:

SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus]

but that does not work and show me no data.What dou you mean? Is it possible to do that? where did I make a mistake?

Thank you very much for your answers

Babak

4

4 回答 4

3

您可以通过将原始查询重写为 7 个连接而不是 3 个连接和 18 个子查询来改进原始查询,如下所示:

SELECT bau.*, bau.CDT AS CdtNr, fze.ID, tpi.Pin
, fpl.F_Klasse_EU AS CLA_EU , fpl.F_Klasse_US AS CLA_US
, fpl.OBD_Code AS KS_Plus, fpl.CDT AS CDT_Plus
, fpl.Fehlerpfad AS Pfad_Plus, fpl.Fehlerunterpfad AS UPfad_Plus
, fmi.OBD_Code AS KS_Minus, fmi.CDT AS CDT_Minus
, fmi.Fehlerpfad AS Pfad_Minus, fmi.Fehlerunterpfad AS UPfad_Minus
, fub.OBD_Code AS Unterbr, fub.CDT AS CDT_Unterbr
, fub.Fehlerpfad AS Pfad_Unterbr, fub.Fehlerunterpfad AS UPfad_Unterbr
, fad.OBD_Code AS Aderschl, fad.CDT AS CDT_Aderschl
, fad.Fehlerpfad AS Pfad_Aderschl, fad.Fehlerunterpfad AS UPfad_Aderschl
FROM tb_Fahrzeug                AS fze
JOIN tb_Pinnummern              AS tpi ON tpi.SG = fze.Motor_SG
JOIN tb_bauteile                AS bau ON bau.ID = tpi.Bauteil
LEFT JOIN Fehlercodes_akt_Liste AS fpl ON fpl.ID = bau.[FC_Plus]
LEFT JOIN Fehlercodes_akt_Liste AS fmi ON fmi.ID = bau.[FC_Minus]
LEFT JOIN Fehlercodes_akt_Liste AS fub ON fub.ID = bau.[FC_Unterbrechung]
LEFT JOIN Fehlercodes_akt_Liste AS fad ON fad.ID = bau.[FC_Aderschl]
WHERE fze.ID = [forms]![frm_fahrzeug]![id];

对于仅与此查询有关的索引问题,您可以在 ID 列上创建聚簇索引,并为 tb_bauteile.SG 创建常规索引(假设 MSSQL 语法且没有其他聚簇索引):

CREATE UNIQUE CLUSTERED INDEX idx0 ON tb_Fahrzeug (id);
CREATE INDEX idx0 ON tb_Pinnummern (SG);
CREATE UNIQUE CLUSTERED INDEX idx0 ON tb_bauteile (ID);
CREATE UNIQUE CLUSTERED INDEX idx0 ON Fehlercodes_akt_Liste (ID);

作为最后的考虑,考虑不要将星号选择器(来自 original tb_bauteile.*)用于文档和 IO 目的。请记住,RDBMS 性能问题在很大程度上取决于实际的环境设置。

于 2012-05-08T09:46:40.803 回答
2

请将子查询更改为LEFT JOINs。像这样:

SELECT tb_bauteile.*, tb_bauteile.CDT AS CdtNr, tb_Fahrzeug.ID, tb_Pinnummern.Pin,
    Fehlercodes_akt_Liste_FC_Plus.OBD_Code AS KS_Plus,
    Fehlercodes_akt_Liste_FC_Plus.CDT AS CDT_Plus, 
    Fehlercodes_akt_Liste_FC_Plus.Fehlerpfad AS Pfad_Plus, 
    Fehlercodes_akt_Liste_FC_Plus.Fehlerunterpfad AS UPfad_Plus,
    Fehlercodes_akt_Liste_FC_Minus.OBD_Code AS KS_Minus, 
    Fehlercodes_akt_Liste_FC_Minus.CDT AS CDT_Minus,
    Fehlercodes_akt_Liste_FC_Minus.Fehlerpfad AS Pfad_Minus,
    Fehlercodes_akt_Liste_FC_Minus.Fehlerunterpfad AS UPfad_Minus,
    Fehlercodes_akt_Liste_FC_Unterbrechung.OBD_Code AS Unterbr,
    Fehlercodes_akt_Liste_FC_Unterbrechung.CDT AS CDT_Unterbr,
    Fehlercodes_akt_Liste_FC_Unterbrechung.Fehlerpfad AS Pfad_Unterbr, 
    Fehlercodes_akt_Liste_FC_Unterbrechung.Fehlerunterpfad AS UPfad_Unterbr, 
    Fehlercodes_akt_Liste_FC_Aderschl.OBD_Code AS Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.CDT AS CDT_Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.Fehlerpfad AS Pfad_Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.Fehlerunterpfad AS UPfad_Aderschl,
    Fehlercodes_akt_Liste_FC_Plus.F_Klasse_EU AS CLA_EU,
    Fehlercodes_akt_Liste_FC_Plus.F_Klasse_US AS CLA_US
    FROM tb_Pinnummern 
    INNER JOIN tb_Fahrzeug 
        ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG
    INNER JOIN tb_bauteile 
        ON tb_Pinnummern.Bauteil = tb_bauteile.ID
    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus
        ON Fehlercodes_akt_Liste_FC_Plus.ID=tb_bauteile.[FC_Plus]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus
        ON Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung
        ON Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl
        ON Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl]


    WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id]));

我不知道所有列的来源。但是如果你让它工作,这个建议会比你所有真正奇怪的子查询执行得更快。我可以看到执行这样的子查询的潜在问题:

SELECT
    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste 
     Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 
.....

如果其中一个返回更多的 one 值会发生什么?你可能会得到一个异常,说子查询不能返回更多的一个值。因此,如果您计划将来进行这样的子查询。至少TOP 1在他们身上放一个。像这样:

SELECT
    (SELECT TOP 1 Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste 
     Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 
    .....

但我仍然不建议将其作为解决方案。因为它不是一种优化的方式。

于 2012-05-08T08:42:57.873 回答
1

我认为您应该尝试在 from 子句中添加表 Fehlercodes_akt_Liste 。

你将不得不添加它 4 次,但我相信它比当前查询的每行运行 18 次选择要好

于 2012-05-08T08:33:11.327 回答
0

我没有在您的表中看到 FC_PLUS、FC_MINUS、FC_Unterbrechung 等(bauteile、Fahrzeug、Pinnummer。因此,如果这些只是您为子表单提供的值,则不必在数据源中使用它们。只需在任何情况下使用该 SELECT 语句您需要数据的字段。

于 2012-05-08T08:40:55.343 回答