Frage

Ich habe 3 Tabellen:

  • Parts : Name: interner Name, Active: bool
  • Sprachen : Liste der Sprachen (Englisch, Französisch, Deutsch, ....)
  • PartsTranslations :. RealName und IDs der anderen zwei Tabellen

Ich mochte eine Liste bekommen von Parts Sie mir den internen name sagen, active Status und , wie viele Übersetzungen fehlen (insgesamt lang subtrahieren Übersetzungen gemacht)

Ich habe diese SQL-Abfrage, die mir gibt, was ich brauche (ich weiß nicht, ob dies der bessere Weg ist es zu machen oder nicht, aber es funktioniert):

SELECT 
    parts1.name, 
    parts1.active, 
    (
        (SELECT count(lang.id) 
            FROM languages AS lang) 
        - 
        (SELECT count(trans.id)
            FROM parts AS parts2 
            INNER JOIN partstranslations as trans
            ON parts2.id = trans.partid
            WHERE parts2.id = parts1.id)        
    )
from parts as parts1;

1º Frage -? Wie kann ich diese Abfrage mit Schloss Active machen

2e Frage -? Wie ist die Leistung der letzten Abfrage (teure)

Danke

War es hilfreich?

Lösung

Ich war in der Lage, diese Abfrage in Active mit HqlBasedQuery zu machen, so poste ich hier die Antwort andere in der gleichen Situation wie mir zu helfen.

HqlBasedQuery query = new HqlBasedQuery(typeof(Part),
 @"
    SELECT                     
        par.Id, 
        par.Name, 
        par.Active,                                         
        (SELECT count(*) - count(trans) FROM Language)                                                            
    FROM Part par
        LEFT JOIN par.PartsTranslations trans
    GROUP BY par.Id, par.Name, par.Active, trans.Part
    ");
query.SetQueryRange(startId, currentPageSize);

var results = from object[] summary in
              (ArrayList)ActiveRecordMediator.ExecuteQuery(query)
          select new PartProjection
          {
              Id = (int)summary[0],
              Name = (string)summary[1],
              Active = (bool)summary[2],
              TransMissing = (long)summary[3]                                       
          };

ich auch Paginierung auf dieser Abfrage gemacht haben, und es gibt mir auch ein stronged getippt PartProjection Objekte. Diese Klasse enthält KEINE Active Parameter haben müssen.

Andere Tipps

Ich kann nicht mit Active helfen, aber diese Abfrage sollte mit einer korrelierten Unterabfrage besser als das durchzuführen.

SELECT
    p.name,
    p.active, 
    (SELECT count(*) FROM languages) - count(pt.divid)
FROM
    Parts p
    LEFT JOIN PartsTranslations pt ON p.id=pt.divid
GROUP BY p.id, p.name, p.active

Oder, wenn Sie die korrelierte Unterabfrage verwenden wollen, müssen Sie nicht wieder in ihr von Parts wählen:

SELECT 
    p.name, 
    p.active, 
    (SELECT count(*) FROM Languages) - 
    (SELECT count(*) FROM PartsTranslations WHERE divid = p.id)            
FROM Parts p;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top