2016-03-09 78 views
0

我有一种情况,即从多个表MEMBERS,SS和SSUSED撤回数据。其中'MEMBERS'是成员数据表,'SS'是成员在其账户上购买的产品表,SSUSED是存储产品使用情况的表格。产品可以有1,6或12个用途。所以可以有一对一,一对六或者一对一的比例。当我运行我的查询时,我正在回收所有的用法。我只需要带回最新的(SSUSED.usedate)。用于多个匹配的SQL逻辑

我也试图过滤出某些产品和产品类别,似乎并不完全正常工作。我在这里和那里得到一个随机产品,我似乎无法隔离该问题。我认为这可能是因为我的逻辑不是以一种干净有效的方式编写的。

CODE:

SELECT DISTINCT 
    MEMBERS.scancode, MEMBERS.lname, MEMBERS.fname, MEMBERS.mtypeid, MEMBERS.status, MEMBERS.lastvisit, MEMBERS.datejoin, 
    PRODUCTS.description, EMPLOYEES.lname AS EmpLname, EMPLOYEES.fname AS EmpFName, SSUSED.transactiontype, SS.initialdate, SS.initialquantity, 
    SS.usedquantity, MEMBERTYPES.mtype, SS.ssid, SSUSED.usedate 
FROM PRODUCTCATS INNER JOIN 
    PRODUCTS ON PRODUCTCATS.productcatid = PRODUCTS.productcatid INNER JOIN 
    SS ON PRODUCTS.productid = SS.productid INNER JOIN 
    MEMBERS ON SS.memid = MEMBERS.memid LEFT OUTER JOIN 
    SSUSED ON SS.ssid = SSUSED.ssid INNER JOIN 
    EMPLOYEES ON SSUSED.employeeid = EMPLOYEES.employeeid INNER JOIN 
    MEMBERTYPES ON MEMBERS.mtypeid = MEMBERTYPES.mtypeid 
WHERE  (SS.memid IN 
         (SELECT DISTINCT SS_1.memid 
         FROM   SS AS SS_1 INNER JOIN 
                SSUSED AS SSUSED_1 ON SS_1.ssid = SSUSED_1.ssid INNER JOIN 
                MEMBERS AS MEMBERS_1 ON SS_1.memid = MEMBERS_1.memid 
         WHERE  (MEMBERS_1.siteid = @rvSite) AND (SS_1.productid = '324' OR 
                SS_1.productid = '326') AND (SSUSED_1.usedate BETWEEN @rvStartDate AND @rvEndDate) AND (SSUSED_1.transactiontype = 'Use'))) AND 
        (PRODUCTS.productcatid = '27' OR 
        PRODUCTS.productcatid = '28' OR 
        PRODUCTS.productcatid = '29' OR 
        PRODUCTS.productcatid = '58' OR 
        PRODUCTS.productcatid = '77' OR 
        PRODUCTS.productcatid = '75' OR 
        PRODUCTS.productcatid = '30' OR 
        PRODUCTS.productcatid = '61' OR 
        PRODUCTS.productcatid = '31' OR 
        PRODUCTS.productcatid = '32' OR 
        PRODUCTS.productcatid = '47' OR 
        PRODUCTS.productcatid = '68') AND (SS.productid <> '32' OR 
        SS.productid <> '335' OR 
        SS.productid <> '350' OR 
        SS.productid <> '618' OR 
        SS.productid <> '1312' OR 
        SS.productid <> '1646' OR 
        SS.productid <> '54987' OR 
        SS.productid <> '55937' OR 
        SS.productid <> '58289' OR 
        SS.productid <> '58876' OR 
        SS.productid <> '601691') AND (SSUSED.transactiontype = 'Use' OR 
        SSUSED.transactiontype = 'Expired') AND (SSUSED.usedate >= @rvStartDate) 
+0

这是不是完全清楚这是试图在这里做什么,但也许是TOP 1命令通过SSUSED.usedate DESC?或者,也许你可以用户ROW_NUMBER?我强烈建议你在查询中开始使用别名。它使它们更容易维护。 –

+0

你只需要将所有这些OR改为IN(value1,value2,value3 ..) – sagi

+0

@sagi我打算说同样的事情。考虑以下内容:'(PRODUCTS.productcatid IN('27','28 '','29','58','77','75','30','61','31','32','47','68'))AND(SS.productid NOT IN ('32','335','350','618','1312','1646','54987','55937','58289','58876','601691'))' – Leptonator

回答

0

这并没有真正回答这个问题,但说明了这一点查询多少可以清洁与一些格式,别名和转换那些巨大的名单到谓词。

SELECT DISTINCT m.scancode 
    , m.lname 
    , m.fname 
    , m.mtypeid 
    , m.STATUS 
    , m.lastvisit 
    , m.datejoin 
    , p.description 
    , e.lname AS EmpLname 
    , e.fname AS EmpFName 
    , su.transactiontype 
    , SS.initialdate 
    , SS.initialquantity 
    , SS.usedquantity 
    , mt.mtype 
    , SS.ssid 
    , su.usedate 
FROM PRODUCTCATS pc 
INNER JOIN PRODUCTS p ON pc.productcatid = p.productcatid 
INNER JOIN SS ON p.productid = SS.productid 
INNER JOIN MEMBERS m ON SS.memid = m.memid 
LEFT JOIN SSUSED su ON SS.ssid = su.ssid 
INNER JOIN EMPLOYEES e ON su.employeeid = e.employeeid 
INNER JOIN MEMBERTYPES mt ON m.mtypeid = mt.mtypeid 
WHERE SS.memid IN 
    (
     SELECT DISTINCT SS_1.memid 
     FROM SS AS SS_1 
     INNER JOIN SSUSED AS SSUSED_1 ON SS_1.ssid = SSUSED_1.ssid 
     INNER JOIN MEMBERS AS MEMBERS_1 ON SS_1.memid = MEMBERS_1.memid 
     WHERE MEMBERS_1.siteid = @rvSite 
      AND SS_1.productid in ('324', '326') 
      AND SSUSED_1.usedate BETWEEN @rvStartDate AND @rvEndDate 
      AND SSUSED_1.transactiontype = 'Use' 
    ) 
    AND p.productcatid in('27', '28', '29', '58', '77', '75', '30', '61', '31', '32', '47', '68') 
    AND SS.productid in ('32', '335', '350', '618', '1312', '1646', '54987', '55937', '58289', '58876', '601691') 
    AND su.transactiontype in ('Use', 'Expired' 
    AND su.usedate >= @rvStartDate 

真正能够帮助我们需要的是什么,这是应该做的一些认识,什么是不工作的问题。

+0

' IN'条款帮助解决了不需要的行的问题。谢谢! – Merlin

+0

该查询的一般用途是返回两个特定产品(('324','326')中的SS_1.productid)的使用情况。然后,对于该列表中的每个唯一成员,检索在使用这些产品后添加到其帐户中的所有产品。实质上,我们试图隔离购买特定产品的成员,使用它,然后购买其他产品。但是,多用途产品正在返回多行。我只需要最新最好的用法。 – Merlin

+0

我不能开始告诉你如何去做,因为我不知道这意味着什么。也许你可以在这里使用ROW_NUMBER? –