我有一种情况,即从多个表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)
这是不是完全清楚这是试图在这里做什么,但也许是TOP 1命令通过SSUSED.usedate DESC?或者,也许你可以用户ROW_NUMBER?我强烈建议你在查询中开始使用别名。它使它们更容易维护。 –
你只需要将所有这些OR改为IN(value1,value2,value3 ..) – sagi
@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