根据已解析的列内容连接两个表

时间:2011-07-12 20:02:41

标签: sql sql-server tsql join

我正在尝试连接两个基于两列的表,这两列已经合并(通常不完美)到另一个表列中。我正在尝试加入表格,以便正确的记录相互关联,因此我可以比较FDebitDebit字段。

FMEMO通常是通过Num,然后添加space,然后添加Memo文字生成的。如您所见,我们的流程尚不完善。因此,我想将Num,然后是space,然后将备注字段的前10个字符与FMEMO字段相匹配。

我在下面的代码中包含了示例数据。能否请你就如何做到这一点提出一些建议?

发票表

MEMO Num DEBIT
耗材。索托卡诺1135 2.25
吸食软管(1-1 / 2“)由食物3 74.04
软管/管道:由食物编织的软管(1“)3 98.72
QP10 Meyers地面泵(60hz)3 206.27
笼子包括f罐,明矾零件盒和2桶明矾3 752.03
保持架包括阀门歧管,F1& F2 3 3774.08
笼中有IBC 1135 268.41
用于安装LWTS的Pvc配件。 1175 4.26
用于安装LWTS的Pvc配件。 1175 27.26

费用表

FMEMO FDebit 耗材。索托卡诺41.8 2.25
3吸水管(1-1 / 2 74.04
3软管/管道:编织软管(1 98.72
3 QP10 Meyers地面泵(60hz)3970 206.27
3笼包括f罐,明矾零件盒和2桶明矾14474 752.03
3保持架包括阀门歧管,F1& F2 72638 3774.08
3笼内有IBC 5166 268.41
用于安装LWTS的1175个Pvc配件。 82.03 4.26
用于安装LWTS的1175个Pvc配件。 524.67 27.26

要复制的代码:

CREATE TABLE #tempExpenses (
FMEMO varchar(Max), FDebit money)

CREATE TABLE #tempInvoices (
MEMO varchar(Max), Num integer, DEBIT money)

INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('Supplies. Soto Cano 41.8', 2.25)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Suction Hose (1-1/2', 74.04)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Hose/Tubing:Braided Hose (1', 98.72)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 QP10 Meyers surface pump (60hz) 3970', 206.27)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Cage including f tank, alum parts box and 2 buckets of alum 14474', 752.03)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 Cage including valve manifold, F1 & F2 72638', 3774.08)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('3 cage with IBC in it 5166', 268.41)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('1175 Pvc accesories for installation of LWTS. 82.03', 4.26)<br/>
INSERT INTO #tempExpenses (FMEMO, FDEBIT) VALUES ('1175 Pvc accesories for installation of LWTS. 524.67', 27.26)<br/>

INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Supplies. Soto Cano', 1135, 2.25)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Suction Hose (1-1/2") by the food', 3, 74.04)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Hose/Tubing:Braided Hose (1") by the food', 3, 98.72)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('QP10 Meyers surface pump (60hz)', 3, 206.27)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Cage including f tank, alum parts box and 2 buckets of alum', 3, 752.03)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Cage including valve manifold, F1 & F2', 3, 3774.08)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('cage with IBC in it', 1135, 268.41)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Pvc accesories for installation of LWTS.', 1175, 4.26)<br/>
INSERT INTO #tempInvoices (MEMO, Num, DEBIT) VALUES ('Pvc accesories for installation of LWTS.', 1175, 27.26)<br/>

SELECT *
FROM #tempExpenses 

SELECT *
FROM #tempInvoices

1 个答案:

答案 0 :(得分:5)

我真的很讨厌自己生成这个TSQL,但我认为这就是你要找的东西:

SELECT *
FROM #tempInvoices i
INNER JOIN #tempExpenses e ON CAST(Num as varchar(10)) + ' ' + SUBSTRING(MEMO,1,9-LEN(CAST(NUM as varchar(10)))) = SUBSTRING(FMEMO,1,10)

连接数字并从字段中取出这么多字符,如果是3然后是9,如果是1111然后是9-4,则从另一个表中加入相同数量的字符。

当然,这是一个非常低效和丑陋的查询。我宁愿规范数据库中的数据(解析干净等)