SQL连接(不重复信息)

时间:2017-09-11 01:52:11

标签: sql join firebird firebird2.5

我有两张桌子:

  • T1:ASSEMBLYLINES(字段为ORDERNUMBER,LINECODE,ORDERQTY,SYSUNIQUEID)

  • T2:ASSEMBLYLINEISSUES(字段为ORDERNUMBER,COMPONENTCODE,ISSUEQTY,SYSUNIQUEID,HEADERSYSUNIQUEID)

在这个例子中有:

1 ASSEMBLYLINE记录,包含以下信息:

13088N03, 810044, 3, 12345678

3 ASSEMBLYLINEISSUES记录包含以下信息:

13088N03, 810044, 1, 11234567, 12345678
13088N03, 810044, 1, 12234567, 12345678
13088N03, 810044, 1, 13234567, 12345678

我的SQL代码是:

SELECT 
ASSEMBLYLINES.ORDERNUMBER, ASSEMBLYLINES.LINECODE, ASSEMBLYLINES.ORDERQTY, 
ASSEMBLYLINEISSUES.ORDERNUMBER, ASSEMBLYLINEISSUES.COMPONENTCODE, ASSEMBLYLINEISSUES.ISSUEQTY

FROM ASSEMBLYLINES
LEFT JOIN ASSEMBLYLINEISSUES ON ASSEMBLYLINES.SYSUNIQUEID = ASSEMBLYLINEISSUES.HEADERSYSUNIQUEID

结果是:

ORDERNUMBER LINECODE    ORDERQTY    ORDERNUMBER2    COMPONENTCODE   ISSUEQTY
13088C33    800038            3         13088C33    800038             1
13088C33    800038            3         13088C33    800038             1
13088C33    800038            3         13088C33    800038             1

但这看起来像9被命令,但实际上只订购了3个。是否有可能获得如下结果:

ORDERNUMBER LINECODE    ORDERQTY    ORDERNUMBER2    COMPONENTCODE   ISSUEQTY
13088C33    800038            3         13088C33    800038             1
13088C33    800038                      13088C33    800038             1
13088C33    800038                      13088C33    800038             1

我可以做两个单独的SQL,然后使用Excel创建它,但我想尽可能避免这种情况。

我也不想在ISSUEQTY上使用SUM公式。

*提前致谢。我试图以清晰简洁的方式构建我的问题,但是表格会对结果有所帮助。在编辑器中看起来很好,但结果不是很好,所以会试着查看如何最好地显示它。

2 个答案:

答案 0 :(得分:2)

您可以在查询中引入CASErow_number,以获得所需的结果,如下所示。

SELECT a.ORDERNUMBER,
       a.LINECODE,
       CASE
           WHEN row_number() over(partition BY a.ORDERNUMBER, a.LINECODE,b.ORDERNUMBER, b.COMPONENTCODE, b.ISSUEQTY
                                  ORDER BY a.ORDERNUMBER) = 1 THEN a.ORDERQTY
           ELSE NULL
       END AS Order_Quantity,
       b.ORDERNUMBER,
       b.COMPONENTCODE,
       b.ISSUEQTY
FROM ASSEMBLYLINES a
LEFT JOIN ASSEMBLYLINEISSUES b ON a.SYSUNIQUEID = b.HEADERSYSUNIQUEID;

<强>结果:

ordernumber linecode    order_quantity  ordernumber  componentcode  issueqty
-----------------------------------------------------------------------------
13088N03    810044          3            13088N03       810044         1
13088N03    810044                       13088N03       810044         1
13088N03    810044                       13088N03       810044         1

您可以查看演示 here

希望这会有所帮助。

答案 1 :(得分:2)

ROW_NUMBER()函数是在Firebird 3.0中引入的(请参阅:Window Functions),因此您无法在Firebird 2.5中使用它。但您可以使用stored procedureexecute block使用临时上下文变量。例如:

Image