我试图在一个表中列出条形码编号,并确定另一个表中存在哪些条形码编号。同样,条形码编号组对应于一个框,我还需要知道哪些框完全匹配并且可以处理。不幸的是,条形码数字有时会带有无关的非数字字符,所以我在内连接的两侧使用REPLACE功能' ON'声明。下面的查询可以很好地确定table2中table1中存在哪些项目。 (DOCINDEX245是表2上的'条形码'列)
SELECT DISTINCT [BAR CODE]
,[Box]
FROM Table1 ft
INNER JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
where REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
我遇到的问题是,如果我试图找到表1中不存在于表2中的行。
我试过了:
SELECT DISTINCT [BAR CODE]
,[Box]
FROM Table1 ft
LEFT JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
where REPLACE(doc.DOCINDEX245,'M','') is null
但在我取消它之前,它没有结果就跑了20分钟。
注意,Table1是10列乘60,000行,Table2是300列乘以140万行。
DOCINDEX245上有一个索引,我重新组织了但它似乎没有做任何事情,或者说不够。
这一切都说,正如我在顶部提到的那样,我需要确定哪些方框是完整的'它有一些不匹配的行和哪些行。
所以我的理想结果将是:
BARCODE, BOX, MATCH
12345,box1,yes
12346,box1,yes
12347,box1,yes
12348,box2,yes
12349,box2,no
12350,box2,yes
等
我打算尝试使用上面两个查询的结果在Excel中手动创建,但是如果有一个查询可以做到这一点,那我就听见了。
所以我想我在这里有多个问题,所以我对所有建议持开放态度。
由于
答案 0 :(得分:1)
试试这个
SELECT [BAR CODE], [Box], 'yes' as match
FROM Table1 ft
INNER JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
union
SELECT [BAR CODE], [Box], 'no'
FROM Table1 ft
LEFT JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
WHERE doc.DOCINDEX245 is null;
答案 1 :(得分:1)
你是正确的,索引无济于事。这是由于在连接条件中使用了函数,在本例中为REPLACE。这就排除了索引的使用。理想情况下,您将使用以下表格:
ON ft.[BAR CODE] = doc.DOCINDEX245
要执行此操作,您可能需要使用persisent计算列来删除无关的字符。请参阅https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-computed-column-definition-transact-sql
上的MS文档(SQL 2008)定义该列后,在其上添加索引,并在连接的Table1一侧的连接条件中使用它。
答案 2 :(得分:0)
尝试下面它将为您提供table1中的所有记录,table2中的table1记录,表2中没有的table2记录。如果这是您想要的:
SELECT DISTINCT [BAR CODE]
,[Box]
FROM Table1 ft
FULL OUTER JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
where REPLACE(doc.DOCINDEX245,'M','') is null AND ft.[BAR CODE] IS NOT NULL
如果您的要求不同,请分享一些输入样本数据。
答案 3 :(得分:0)
当您的内部加入工作正常时,您可以将其连接回表1:
with cte as
( SELECT DISTINCT [BAR CODE]
,[Box]
FROM Table1 ft
INNER JOIN Table2 doc
ON REPLACE(REPLACE(ft.[BAR CODE],'M',''),'-WDRN','') = REPLACE(doc.DOCINDEX245,'M','')
)
select ft.*,
case when cte.[BAR CODE] is null then 'no' else 'yes' end as match
FROM Table1 ft
LEFT JOIN cte
ON ft.[BAR CODE] = cte.[BAR CODE]
AND ft.[Box] = cte.[Box]