2011-11-15 9 views
1

ジョインがサブクエリよりも効率的で、クエリが非常に遅く、多くのサブクエリが使用されるため、それを改善するが、方法を知らない。同じテーブル内の別のレコードを調べるときにSQLサブクエリをジョインに変換するアクセス2010

私は以下の表を持っている:

People \\this table stores lists of individual people with the following fields 
( 
    ID, \\Primary Key 
    aacode Text, \\represents a individual house 
    PERSNO number, \\represent the number of the person in the house e.g. person number 1 
    HRP number, \\the PERSNO of the Housing Reference Person (HRP) the "main" person in the house 
    DVHsize number, \\the number of people in the house 
    R01 number, \\the persons relationship to the person who is PERSNO=1 
    R02 number, \\the persons relationship to the person who is PERSNO=2 
    R03 number, \\the persons relationship to the person who is PERSNO=3 
    AgeCat text, \\the age range of the person e.g. 30-44 
    xMarSta number, \\representing the marital satus of the person 
) 
Relatives \\this table stores the possible R01 numbers and their text equivalents 
(
    ID Primary Key, \\all possible R01 values 
    Relationship text, \\meaning of the corisponding R01 values 
) 
xMarSta \\this table store the possible xMarSta values and their text equivalents 
(
    ID Primary Key \\all possible xMarSta values 
    Marital text, \\meaning of corresponding R01 values 
) 

クエリは次のとおりです。

HsHld - このクエリの目標は、各家のために作成することである(すなわち、各aacode)に家を記述したテキスト刺しますフォーム[Marital][AgeCat][Relationship][AgeCat][Relationship][AgeCat]などだから、3人の家のための出力がMarried(30-44)Spouse(30-44)Child(1-4)

のように見えるかもしれません私はHsHldのための私の現在のコードはひどいですが、それは以下に含まれている知っている:

SELECT People.ID, People.aacode, People.PERSNO, 
     People.HRP, People.DVHsize, xMarSta.Marital, 
     [Marital] & " (" & [AgeCat] & ")" & [RAL2] & [RAge2] & 
     [RAL3] & [RAge3] & [RAL4] & [RAge4] & [RAL5] & [RAge5] & 
     [RAL6] & [RAge6] & [RAL7] & [RAge7] & [RAL8] & [RAge8] AS HsTyp, 
     (SELECT Fam2.R01 FROM People AS Fam2 WHERE Fam2.aacode = People.aacode 
     AND Fam2.PERSNO = 2) AS Rel2, 
     (SELECT Fam3.R01 FROM People AS Fam3 WHERE Fam3.aacode = People.aacode 
     AND Fam3.PERSNO = 3) AS Rel3, 
     Switch([Rel2] Is Null,Null,[Rel2]=-9,'DNA',[Rel2]=-8,'NoAns', 
       [Rel2]=1,'Spouse',[Rel2]=2,'Cohabitee',[Rel2]<7,'Child', 
       [Rel2]<10,'Parent',[Rel2]<15,'Sibling',[Rel2]=15,'Grandchild', 
       [Rel2]=16,'Grandparent',[Rel2]=17,'OtherRelative', 
       [Rel2]=20,'CivilPartner',True,'Other') AS RAL2, 
     Switch([Rel3] Is Null,Null,[Rel3]=-9,'DNA',[Rel3]=-8,'NoAns', 
       [Rel3]=1,'Spouse',[Rel3]=2,'Cohabitee',[Rel3]<7,'Child', 
       [Rel3]<10,'Parent',[Rel3]<15,'Sibling',[Rel3]=15,'Grandchild', 
       [Rel3]=16,'Grandparent',[Rel3]=17,'OtherRelative', 
       [Rel3]=20,'CivilPartner',True,'Other') AS RAL3, 
     (Select FAge2.AgeCat FROM People AS FAge2 
       WHERE FAge2.aacode = People.aacode 
       AND FAge2.PERSNO = 2 
     ) AS RAge2, 
     (Select FAge3.AgeCat FROM People AS FAge3 
       WHERE FAge3.aacode = People.aacode AND FAge3.PERSNO = 3 
     ) AS RAge3 
FROM Relatives 
RIGHT JOIN (xMarSta RIGHT JOIN People ON xMarSta.ID=People.xMarSta) 
      ON Relatives.ID=People.R01 
WHERE (((People.HRP)=[People.PERSNO])) 
ORDER BY People.aacode; 

変更する必要があるいくつかの重要なものがあります。現時点で

  1. 私は テーブルが動作するように親戚に相対分野からの参加を得ることができないので、私は より良い方法がなければならないRALと呼ばれるスイッチ機能を使用しています。
  2. 投稿を簡単にするため、Rel2 & Rel3などしか含まれていませんが、実際のコードではRel13になります!したがって、パフォーマンスの問題はさらに悪化します。
  3. これらのサブクエリを結合で置き換えたいのですが、サブクエリ が同じテーブル内の別のレコードを調べると、これについてはわかりません。
  4. 私は非常にこれで私の深さの外に、私は少しSQLを知っていますが、この問題の 複雑さは、自己がエイリアスで行われ、それにテーブルを結合
+0

ああ、ちょうどノート、あなたが重複質問を開くべきではありません、編集の質問のideiaは、あなたの最初の質問は、あなたは明らかでなかった場合ということですより多くの情報を編集して提供することができます。今は3つの重複した質問があります。他のものを複写して閉じてこれにリンクすることを検討してください。 –

答えて

0

まず最初に、関係の状況がありますが、テーブル構造は列を使用して関係を表現していることです。これは、あなたのテーブルの上にR01、R02、R03 ... R13列を与えます。残念ながら、テーブル構造がリレーショナルの代わりに反復的に非正規化されているため、パフォーマンスを大幅に変更することはできません。これは、あなたが13回を繰り返し述べたように、あなたのクエリは、すべてこの繰り返しのコードが必要になることを意味します。それはまた、あなたのスイッチ機能が加わることで置き換えることができますが、再び13回繰り返されることを意味します。

右のように、クエリに戻ると、クエリに複数のサブ選択があり、FROM句の左側の結合で関連するテーブルを結合し、選択した新しいエイリアスを使用する必要があります。今度は、以下の例では、R01、R02のフィールドごとにFam2、Fam3の関係があり、これを13回行う必要があります。それぞれの場合、親戚のテーブルにリンクする必要があります私はRelat2、Relat3などを呼びました)。今度は、正規化された構造のデータベース構造を変更することができれば、本当にこのクエリを単純化し、より簡単な結合を使用できます。

この1つはあなたがプロセスを理解するのに役立ちますかどうかを確認してください:

SELECT People.ID, People.aacode, People.PERSNO, 
     People.HRP, People.DVHsize, xMarSta.Marital, 
     [Marital] & " (" & [People.AgeCat] & ")" & [RAL2] & [RAge2] & 
     [RAL3] & [RAge3] AS HsTyp, 
     Fam2.R01 AS Rel2, 
     Fam3.R01 AS Rel3, 
     Relat2.Relationship as RAL2, 
     Relat3.Relationship as RAL3, 
     Fam2.AgeCat AS RAge2, 
     Fam3.AgeCat AS RAge3 
FROM (((((People 
LEFT JOIN (People AS Fam2) ON (Fam2.aacode = People.aacode and Fam2.PERSNO = 2)) 
LEFT JOIN (Relatives as Relat2) on Relat2.Id = Fam2.R01) 
LEFT JOIN (People as Fam3) ON (Fam3.aacode = People.aacode AND Fam3.PERSNO = 3)) 
LEFT JOIN (Relatives as Relat3) on Relat3.Id = Fam3.R01) 
LEFT JOIN xMarSta ON xMarSta.ID=People.xMarSta) 
WHERE (People.HRP=[People.PERSNO]) 
ORDER BY People.aacode; 
+0

ありがとうございましたこれは完全に私の問題を解決します – falcs

0

私の限られた知識のために多すぎます

例えば

から

を選択* [表1] T1.SomeFieldの[表1] T1に参加= Table1.SomeOtherField

Probalyはそれを修正する時間がありませんが、本当の問題はどこで

など。あなたは、あなたがたときに、CRことかかわらを管理する必要がありますが、他のテーブルを持っている必要があり RelationshipID PersonFrom PersonTo R01、R02などと

をdenormalisedましたそれはあなたのUIとロジックの変更を意味します。

+0

私はこのメソッドを使用してRAge2フィールドを置き換えようとしましたが、現在のレコードが存在しないというエラーメッセージが表示されます。(Peopleを選択してください:[AgeCat] FROM [People] INNER JOIN [People] AS P2 on People.aacode = P2.aacode WHERE P2.PERSNO = 2)AS RAge2、 – falcs

+0

あなたの質問を見て、少しカフを外して、私は今あなたのスキーマで少し混乱していると答えました。レコードと表の間の暗黙の関係を示すPeople、Relations、XMarStaの例の行をいくつか追加して投稿できますか?私は何が起こっているか見ることができると思う。ああ、スキーマをやり直すのではなく、クエリで一時テーブルを使用して処理することができます。 –

関連する問題