簡體   English   中英

兩個表的選擇性聯接(SQL Server)

[英]Selective join for two tables (SQL Server)

如何連接這兩個表:

表格1

DOCNUM  INVNUM  INVSEQ*
PO01    INV001  2365301
PO01    INV002  2365302
PO01    INV003  2365303
PO02    INV007  2365450
PO02    INV008  2365451

表2

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

為此:

 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 

有什么想法嗎?

模式已損壞。 在這些表中,您應該有一個附加列以匹配發票編號。 根據提供的信息,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
;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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM