我整整两个星期都试图这样做,但似乎无济于事。这里涉及3个表。但我期待结果将是截然不同的情况。在同一天和用户。否则,它必须全部归还。
SELECT DISTINCT A.CASENO,A.DATE,A.TIME,A.TRANNO,B.PCODE,C.PDESC,A.USER
FROM tableA A
RIGHT JOIN tableB B ON A.CASENO=B.CASENO
RIGHT JOIN tableC C ON C.PCODE=B.PCODE
WHERE A.DATE between 140124 and 140331
结果仍然有重复,因为不是同一时间和tranno。查看CASENO.= 08088040
A.CASENO A.DATE A.TIME A.TRANNO B.PCODE C.PDESC A.USER
08088040 140124 182516 321 TYQ PREPLAN1 ANTHONY
08088040 140124 182131 318 TYQ PREPLAN1 ANTHONY
36360569 140128 111056 431 CVB POSTT1 MARIA
36360569 140310 113221 433 CVB POSTT1 MARIA
37386911 140213 150240 230 M2P PLANAVG FELISE
37386911 140213 135220 223 M2P PLANAVG HECTOR
39222881 140128 94122 104 TYQ PREPLAN1 ELLA
40895213 140213 164409 104 CVB POSTT1 WINNIE
51311866 140124 103203 319 M2P PLANAVG BRATT
对于相同的日期,相同的用户和相同的pcode和pdesc,caseno。由于时间和tranno的不同,08088040出现了两次。这里max tranno表示在同一案件中完成的最新交易。最大时间还显示针对该特定情况的最新日期时间操作。是在2014年1月24日@ 18:25:16。对于相同的日期和用户,我只想要最新的交易细节。
我尝试添加以下脚本作为第一个条件,但结果是0.在我获得输出之前,它也导致了很长的延迟。
WHERE A.TRANNO=(SELECT MAX(TRANNO) FROM tableA A where A.CASENO=B.CASENO)
仅供参考,休息,例如。案件号由于用户不同,37386911被认为是唯一的,因此我希望将其返回。同时,案件编号No.36360569也是独特的记录,因为日期不同。虽然是同一个用户。
那么,我该怎么做呢?我发现的大多数例子只显示了1个表和1个标准来获得不同的值。
该脚本应该是用于SQL DB2的脚本。我在SQL中实际上根本没有背景。我之前所做的大部分查询都是基于反复试验,但由于没有像这样复杂的条件,所以它很成功。
希望这里有专家可以分享知识。
非常感谢你。
此致 DELL
答案 0 :(得分:0)
这对我有用:
SELECT A.CASENO, A.DATE, A.TIME, A.TRANNO, B.PCODE, C.PDESC, A.USER
FROM tableA A
RIGHT JOIN tableB B ON A.CASENO=B.CASENO
RIGHT JOIN tableC C ON C.PCODE=B.PCODE
WHERE A.DATE between 140124 and 140331
AND A.TRANNO = (SELECT MAX(TRANNO) FROM tableA A2 WHERE A2.CASENO=A.CASENO)
<强>解释强>
您不能使用distinct来解决您的问题,因为您希望结果中的数据与您要过滤的内容不同。您可以使用其他过滤器(WHERE)。
SQLFiddle(参见结果): http://sqlfiddle.com/#!6/da130/2/0
注意:我必须将USER列更改为USERN,因为USER是我选择的数据库引擎中的保留字。
答案 1 :(得分:0)
您的where子句对于案例号为No.36360569是错误的,因为您只使用caseno
进行过滤。案件号码No.36360569有相同的caseno但不同的日期,所以就像@ JennyO'Reilly的样本一样,你将离开tranno 433但是错过了tranno 431。
因此,您应该在子查询中添加日期比较。但是在像这样的where子句中使用子查询是无效的。我的建议是使用CTE表获取tableA的主键集,然后内部加入其他的而不是where子句。
with pkset as
(SELECT
A.CASENO,A.DATE,max(A.TRANNO) as tranno
--,A.USER I'm not sure if user is part of the primary key set, can't figure out by your question
FROM tableA
GROUP BY A.CASENO,A.DATE
)
SELECT A.CASENO, A.DATE, A.TIME, A.TRANNO, B.PCODE, C.PDESC, A.USER
FROM tableA A
INNER JOIN pkset ON pkset.CASENO=B.CASENO and pkset.DATE=A.DATE and pkset.TRANNO=a.TRANNO
RIGHT JOIN tableB B ON A.CASENO=B.CASENO
RIGHT JOIN tableC C ON C.PCODE=B.PCODE
WHERE A.DATE between 140124 and 140331
顺便问一下,你可以将RIGHT JOIN更新为LEFT JOIN吗?似乎没有必要使用右连接,并且可以让A. * B. *具有空值。