我怎样才能加入这两张桌子:
Table1
DOCNUM DOCTYPE COST POLINE*
PO01 1 8 18334
PO01 1 17 18335
PO01 1 8 18336
PO02 1 16 18787
PO02 1 14 18788
PO03 2 14 18850
PO04 2 14 18894
Table2
DOCNUM INVNUM INVSEQ*
PO01 INV001 2365301
PO01 INV002 2365302
PO01 INV003 2365303
PO02 INV007 2365450
PO02 INV008 2365451
为了做到这一点:
DOCNUM DOCTYPE COST INVNUM
PO01 1 8 INV001
PO01 1 17 INV002
PO01 1 8 INV003
PO02 1 16 INV007
PO02 1 14 INV008
PO03 2 14 NULL
PO04 2 14 NULL
我尝试过各种类型的联接,但最接近的是使用ROW_NUMBER()连接两个表.
大多数时候我都会得到这个:
DOCNUM DOCTYPE COST INVNUM
PO01 1 8 INV003
PO01 1 17 INV004
PO01 1 8 INV005
PO01 1 8 INV003
PO01 1 17 INV004
PO01 1 8 INV005
PO01 1 8 INV003
PO01 1 17 INV004
PO01 1 8 INV005
PO02 1 16 INV007
PO02 1 14 INV008
PO02 1 16 INV007
PO02 1 14 INV008
PO03 2 14 NULL
PO04 2 14 NULL
(因为连接对DOCNUM的每个类似条目重复)
或者这个:
DOCNUM DOCTYPE COST INVNUM
PO01 1 8 INV003
PO01 1 17 INV004
PO01 1 8 INV005
PO02 1 16 INV007
PO02 1 14 INV008
(没有任何PO03或PO04)
我正在考虑给DOCNUM编号,然后只有当计数为'1‘时才能加入,但我不知道如何计算唯一的字段:
Count DOCNUM DOCTYPE COST
1 PO01 1 8
2 PO01 1 17
3 PO01 1 8
1 PO02 1 16
2 PO02 1 14
1 PO03 2 14
1 PO04 2 14
有什么想法吗?
发布于 2014-07-09 14:53:04
模式被打破了。在这些表中应该有一个额外的列来匹配发票号。根据提供的信息,InvNum字段甚至可能只是table1的一部分,尽管我知道这可能只是表中相关字段的部分列表。
如果您至少在每个表中都有一个列,从而可以保证订单--甚至是日期时间字段--我们仍然可以这样做。实际上,您来自table1的记录甚至不能保证是唯一的--没有主键。这不是数据库成功的好方法。
我可以向您提供下面的查询,这在大多数情况下可能会起作用,但不需要存储更多的信息,Sql Server可以随时更改对您的行的排序,并打破它,这样它就可以随时间返回不一致的结果。
SELECT t1.docnum, t1.doctype, t1.code, t2.invnum
FROM
(
select *, row_number() over (partition by docnum ORDER BY docnum, poline) as ordinal
from table1
) t1
LEFT JOIN
(
select *, row_number() over (parition by docnum ORDER BY docnum, invseq) as ordinal
) t2 ON t2.docnum = t1.docnum and t2.ordinal = t1.ordinal
发布于 2014-07-09 15:04:49
;WITH CTE1 AS
(
select t.doctype,t.docnum,t.code, row_number() over (partition by docnum ORDER BY docnum, doctype) as ordinal
from table1 t
),
CTE2 AS
(select tt.docnum, row_number() over (parition by docnum ORDER BY docnum, invnum) as ordinal from Table2 tt)
Select c.docnum, c.doctype, c.code, cc.invnum from CTE1 C
LEFT JOIN CTE2 CC
ON C.docnum = CC.docnum AND C.ordinal = cc.ordinal
https://stackoverflow.com/questions/24656780
复制相似问题