2014-09-10 38 views
0

我想获得一个有效的方式做下面的存储过程。此过程将显示属于所有类别市场中企业的汽车数量。有效的SQL存储过程与连接和不同

我有类别表是主要选择,然后我进入汽车表来计算汽车并在类别内加入他们的业务,这里是真正效率低下的地方我然后检查选定的市场/地点或没有选择所有市场。这里是。

Create PROC [USP_CAT] 
    @MKT int 

AS 

BEGIN 

    SELECT *, 
     (
     SELECT COUNT(CAR_ID) 
     FROM CARS 
     INNER JOIN BUSINESS ON CAR_BIZ=BIZ_ID 
     JOIN BIZCATS ON BC_BIZ = BIZ_ID AND BC_CAT = CAT_ID 
     WHERE BIZ_APPROVED = 1 AND BIZ_EXPIRES >= getDate() AND 
     (
      SELECT COUNT(BLOC_MKT) 
      FROM BIZLOCS 
      WHERE BIZ_ID = BLOC_BIZ AND (BLOC_MKT = @MKT OR @MKT = -1) 
     )>0 
    ) AS CAT_CAR_COUNT 
    FROM CATS 
    WHERE CAT_HIDE = 0 
    ORDER BY CAT_ORDER asc 

END 

任何建议来整理这是非常赞赏。

+2

如果您发布了DDL,一些示例插入以及您期望的结果,您将获得更好的结果。 – granadaCoder 2014-09-10 12:58:02

回答

0

我认为一个EXISTS(http://msdn.microsoft.com/en-us/library/ms188336.aspx)可能会有所帮助。

Create PROC [USP_CAT] 
    @MKT int 

AS 

BEGIN 

    SELECT *, 
     (
     SELECT COUNT(CAR_ID) 
     FROM CARS 
     INNER JOIN BUSINESS ON CAR_BIZ=BIZ_ID 
     JOIN BIZCATS ON BC_BIZ = BIZ_ID AND BC_CAT = CAT_ID 
     WHERE BIZ_APPROVED = 1 AND BIZ_EXPIRES >= getDate() AND EXISTS 
     (
      SELECT BLOC_MKT 
      FROM BIZLOCS 
      WHERE BIZ_ID = BLOC_BIZ AND (BLOC_MKT = @MKT OR @MKT = -1) 
     ) 
    ) AS CAT_CAR_COUNT 
    FROM CATS 
    WHERE CAT_HIDE = 0 
    ORDER BY CAT_ORDER asc 

END 
+0

谢谢德鲁,这确实是一个改进;我会和它一起去的。 只是一个侧面说明,这不是整个项目的重要组成部分,所以如果它影响我们完成后的性能,我会选择一个不计数的选项,只显示类别。 – user3010431 2014-09-10 17:12:04