0

次の 2 つのテーブルがあるとします。

テーブル パーツ:

Location PartNum Descrip  
-------- ------- --------
Whse1    abc     Frobbitz
Whse2    abc     Frobbitz
Whse3    def     Widget
Whse3    def     Widget

テーブルのステータス:

Location  PartNum Status
--------- ------- --------------
*Default* abc     Ready To Ship
*Default* def     Ready To Ship
Whse1     abc     Backordered

ほとんどの場合、デフォルトのステータスを使用する必要があります。

ステータスを取得するには、クエリは次のようになります。

SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p
LEFT JOIN Status s ON s.PartNum=p.PartNum AND
s.Location = (SELECT MAX(Location) FROM Status s1
WHERE s1.PartNum=p.PartNum AND s1.Location
IN('*Default*',p.Location))

問題は、これが最も効率的な (または少なくとも合理的に効率的な) 方法であるかということです。私の実際のアプリケーションでは、1 つのクエリで最大 7 つのテーブルが結合されます。

4

3 に答える 3

0

あなたがやろうとしているのは、フォールバックのデフォルトを使用しているようです。サブクエリを使用する代わりに、テーブルを 2 回結合するなどの方法を試すことができます。

SELECT p.Location,p.PartNum,p.Descrip,s.Status 
FROM Parts p 
LEFT JOIN Status s1 ON s1.PartNum=p.PartNum AND p.Location = s1.Location 
LEFT JOIN Status s ON p.PartNum = s.PartNum 
   AND s.Location = IFNULL(s1.Location, '*Default*');

基本的に、s1デフォルト以外の情報を表します。s1.Locationかどうかを確認することで、そのような行が存在するかどうかを判断し、存在しない場合にNULLフォールバックできます。*Default*

それが役立つことを願っています!

于 2012-11-01T19:45:33.663 に答える
0
SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p
LEFT outer JOIN Status s ON s.PartNum=p.PartNum 
where
s.Location = (SELECT MAX(Location) FROM Status s1
WHERE s1.PartNum=p.PartNum AND s1.Location
IN('*Default*',p.Location))
于 2012-11-01T18:42:39.147 に答える
0

以下のようにLimit1 を使用できると思います。Order by

 SELECT p.Location,p.PartNum,p.Descrip,s.Status FROM Parts p
  LEFT JOIN Status s ON s.PartNum=p.PartNum AND
  s.Location = (SELECT Location FROM Status s1
        WHERE s1.PartNum=p.PartNum ORDER BY s1.Location ASC LIMIT 1);

*Default*検索で順番に上位に来ると仮定します。

于 2012-11-01T18:34:25.313 に答える