在最短的时间内加入3个表并返回不同的值

时间:2014-10-17 06:05:17

标签: db2 max

我整整两个星期都试图这样做,但似乎无济于事。这里涉及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

2 个答案:

答案 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. *具有空值。