[英]Selective join for two tables (SQL Server)
如何連接這兩個表:
表格1DOCNUM 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.