0

假设有两个表:

表零件:

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))

问题是,这是最有效(或至少相当有效)的方式吗?我的实际应用程序将在一个查询中加入多达 7 个表。

4

3 回答 3

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

我认为您可以使用Limit1Order 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 回答
0

看起来您正在尝试做的是使用后备默认值。您可以尝试两次加入表而不是使用子查询:

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 回答