Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较SQL中两个表的值时出现问题_Sql_Sql Server - Fatal编程技术网

比较SQL中两个表的值时出现问题

比较SQL中两个表的值时出现问题,sql,sql-server,Sql,Sql Server,我有一个表(表1),它保存了我从一个简单的文本文件中引入的数据。每一行都有一个RowID,页码和错误的列以空值开头,然后是保存文本文件中每一行的数据列 在我的测试数据中,我知道rowid2在数据列中有一个公司名称(在原始文本文件中大致居中)。我需要将其与Customers表的Col01进行比较,以查看是否存在公司名称。看起来它应该是一个简单的选择,但我得到零行,除非我硬编码表1中的值 这是我尝试过的问题,但运气不好 SELECT c.RowID, c.Col01, c.Col02 FROM C

我有一个表(表1),它保存了我从一个简单的文本文件中引入的数据。每一行都有一个RowID,页码和错误的列以空值开头,然后是保存文本文件中每一行的数据列

在我的测试数据中,我知道rowid2在数据列中有一个公司名称(在原始文本文件中大致居中)。我需要将其与Customers表的Col01进行比较,以查看是否存在公司名称。看起来它应该是一个简单的选择,但我得到零行,除非我硬编码表1中的值

这是我尝试过的问题,但运气不好

SELECT c.RowID, c.Col01, c.Col02 
FROM Customers c 
WHERE c.Col01 = 
    (SELECT RTRIM(LTRIM(t.Data)) 
     FROM Table1 t 
     WHERE t.RowID = '2')
如果我硬编码表1的rowid2中的值,我会得到几个匹配项(Col02和Col03中的地址不同)。因此,我知道客户中的数据与Rowid2上表1的数据列中的值相匹配

目标是为customers表中的客户将表1中的Errors列更新为G,为非成员/客户的客户将表B中的Errors列更新为B

那么,当存在匹配项时,为什么上面的select语句返回零行呢


我正在使用MS SQL 2008。我尝试的硬编码版本是

SELECT c.RowID, c.Col01, c.Col02 FROM Customers c WHERE c.Col01 = 'Sunny Donuts'
表1中的值在Sunny之前有35或40个空格,在Donuts之后有几十个空格,所以我使用了LTRIM和RTRIM来消除这个问题

返回了几行。customers表包含以下列:

  • RowID(int,非null)
  • Col01(varchar(100),null)
  • Col02(varchar(100),空)
  • Col03(varchar(100),空)
  • Col04(varchar(100),空)
  • T_状态(字符(1),空)
Col01是公司名称,col02到Col04表示地址、城市、州等。这些都可以是空值

表1有以下列:

  • RowID(int,非null)
  • 页面(整型,空)
  • 错误(varchar(5),null)
  • 数据(varchar(255)null)

这两个表都是旧表(已使用多年)。在这两个表中,RowID都是一个标识规范,种子为1,增量为1

当我对复合SQL语句有问题时,我通常会查看语句部分返回的结果。因此,我将尝试查看这一部分本身返回的内容:

SELECT RTRIM(LTRIM(t.Data)) FROM Table1 t WHERE t.RowID = '2'
如果结果看起来不错,那么我会通过测试返回字符串的长度来寻找隐藏的字符的可能性:

SELECT LEN(RTRIM(LTRIM(t.Data))) FROM Table1 t WHERE t.RowID = '2'
例如,如果第一个查询的结果是“Acme,Inc.”,那么第二个查询应该返回10。如果不存在,则t.数据中有一个字符不应该存在。为了使比较更直观,我将运行以下查询:

SELECT LEN(RTRIM(LTRIM(t.Data))), LEN('Acme, Inc.'), '"' + RTRIM(LTRIM(t.Data)) + '"'
  FROM Table1 t WHERE t.RowID = '2'
上面的第三个值将字符串用引号括起来,以便更好地显示字符串开头或结尾是否存在不可见字符

如果上述内容没有帮助,那么我将重点关注表“Table1”的“RowID”列中的值。如果该列是数值列,最好与数字2进行比较,而不是“2”,以避免隐式转换。如果“RowID”定义为字母数字,我将运行此查询以查看它是否也包含不可见字符:

SELECT LEN(t.RowID), '"' + t.RowID + '"' FROM Table1 t

我希望以上内容能有所帮助。

谢谢诺亚,你说得对


存在隐藏字符(CR和LF),这阻止了匹配。在我从表1中的数据中去掉这些数据后,问题就解决了。

请参见。您能发布您硬编码以成功返回行的查询吗?客户的定义&表1也会有所帮助。我假设您使用的是Oracle数据库
ROWID
是一个保留字伪列,可能会给您带来问题。谢谢。我应该包括这些。我使用的是MS SQL 2008。我尝试的硬编码版本是从客户c中选择c.RowID、c.Col01、c.Col02,其中c.Col01='Sunny Donuts'返回了几行。customers表有以下列:RowID(int,非null)、Col01(varchar(100)、null)、Col02(varchar(100)、null、Col03(varchar(100)、null)、Col04(varchar(100)、null)、T_Status(char(1)、null)Col01是公司名称,Col02到Col04是地址、城市、州等。表1有以下列:RowID(int,非null)、Page(int,null)、Errors(varchar(5),null)和Data(varchar(255)null)。这两个都是旧表(已使用多年)。在这两个表中,RowID都是一个标识规范,种子为1,增量为1。我不确定为什么会投反对票,但发布此答案的原因是询问者注意到Table1是从文本文件导入的,根据我的经验,这通常会导致意外字符进入表中,包括不可见的特殊字符。即使这个问题不完整,也足以证明我的建议是正确的。另外,我假设了SQL Server(与Oracle相反),但是,即使这个假设是一个问题,这些建议仍然有效,即使存在语法上的差异。谢谢Noah。我将尝试在RowID(一个自动递增的标识列)的值周围去掉单引号。我只是尝试将LEN值与预期的字符数进行比较,并且它们匹配,但这是一件好事,因为有时我们会收到不好的数据,感谢您的反馈,@DG86。由于长度匹配,我想知道表1中“Sunny”和“Donuts”之间的字符是否导致了问题。如果您认为这会有所帮助,我会尝试获取该字符的ASCII值。在“Sunny Donuts”示例中,该“空格”将是字符串中的第6个字符;因此,我将尝试
从表1 t中选择ASCII(子字符串(RTRIM(t.Data)),6,1),其中t.RowID=2
,如果它不返回32,则它不是传统的空格,并且是不匹配的原因。我想你在硬编码版本的“Sunny Donuts”中键入了一个空格。