首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >两个表的选择性连接( Server)

两个表的选择性连接( Server)
EN

Stack Overflow用户
提问于 2014-07-09 14:42:53
回答 2查看 1.2K关注 0票数 0

我怎样才能加入这两张桌子:

Table1

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
DOCNUM  INVNUM  INVSEQ*
PO01    INV001  2365301
PO01    INV002  2365302
PO01    INV003  2365303
PO02    INV007  2365450
PO02    INV008  2365451

为了做到这一点:

代码语言:javascript
运行
复制
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()连接两个表.

大多数时候我都会得到这个:

代码语言:javascript
运行
复制
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的每个类似条目重复)

或者这个:

代码语言:javascript
运行
复制
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‘时才能加入,但我不知道如何计算唯一的字段:

代码语言:javascript
运行
复制
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

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-09 14:53:04

模式被打破了。在这些表中应该有一个额外的列来匹配发票号。根据提供的信息,InvNum字段甚至可能只是table1的一部分,尽管我知道这可能只是表中相关字段的部分列表。

如果您至少在每个表中都有一个列,从而可以保证订单--甚至是日期时间字段--我们仍然可以这样做。实际上,您来自table1的记录甚至不能保证是唯一的--没有主键。这不是数据库成功的好方法。

我可以向您提供下面的查询,这在大多数情况下可能会起作用,但不需要存储更多的信息,Sql Server可以随时更改对您的行的排序,并打破它,这样它就可以随时间返回不一致的结果。

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2014-07-09 15:04:49

代码语言:javascript
运行
复制
;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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24656780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档