查询显示一个表以及哪些行与另一个表

时间:2018-04-04 20:55:51

标签: sql sql-server sql-server-2008 join

我试图在一个表中列出条形码编号,并确定另一个表中存在哪些条形码编号。同样,条形码编号组对应于一个框,我还需要知道哪些框完全匹配并且可以处理。不幸的是,条形码数字有时会带有无关的非数字字符,所以我在内连接的两侧使用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中手动创建,但是如果有一个查询可以做到这一点,那我就听见了。

所以我想我在这里有多个问题,所以我对所有建议持开放态度。

由于

4 个答案:

答案 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]