即使两个表中都存在连接条件,内部连接也不会返回任何记录

时间:2013-08-15 14:12:06

标签: sql join

我正在尝试在两个表上执行内部联接,并且没有返回任何记录。两个表都在邮政编码上加入,邮政编码存储为VARCHAR(50)。

    SELECT 
        T1.Name
       ,T1.PostalCode
       ,T2.Address
    FROM FirstTable as T1
        INNER JOIN SecondTable as T2 ON T1.PostalCode = T2.PostalCode

结果是没有返回记录。我尝试在两个表中的“邮政编码”字段中修剪空格,但仍然没有结果。

然后我尝试使用单独的select语句来缩小问题范围。下面的select语句返回带有邮政编码和地址的记录:

    SELECT PostalCode, Address, FROM SecondTable WHERE PostalCode = 'A1A1A1'

当我在第一个表上尝试此查询时,不会返回任何记录:

    SELECT Name, PostalCode FROM FirstTable WHERE PostalCode = 'A1A1A1'

这非常令人困惑,因为在Excel中手动查看表会显示邮政编码存在记录。

有没有人有任何想法?

3 个答案:

答案 0 :(得分:2)

  

当我在第一个表上尝试此查询时,不会返回任何记录:

  SELECT Name, PostalCode FROM FirstTable WHERE PostalCode = 'A1A1A1'

那你去吧。在此之前,连接也不起作用。所以你有一些不好的数据。以下是一些您可以尝试帮助缩小错误范围的查询:

SELECT Name, PostalCode, Len(PostalCode) FROM FirstTable WHERE PostalCode LIKE '%A1A1A1'

SELECT Name, PostalCode, Len(PostalCode) FROM FirstTable WHERE PostalCode LIKE 'A1A1A1%'

SELECT Name, PostalCode, Len(PostalCode) FROM FirstTable WHERE PostalCode LIKE '%A1A1A1%'

SELECT Name, PostalCode, Len(PostalCode) FROM FirstTable WHERE PostalCode LIKE 'A%1A1A1%'

......以及同一主题的更多变化。

答案 1 :(得分:1)

可能你可能隐藏了换行不会删除的换行符。

尝试对表运行查询并检查字段的长度,看它们是否符合您的预期。

SELECT Name, PostalCode, LEN(PostalCode)
FROM FirstTable
WHERE LEN(PostalCode) > 6 -- or whatever value.

删除换行符。

UPDATE FirstTable SET PostalCode = SET REPLACE(REPLACE(PostalCode, CHAR(13), ''), CHAR(10), '')

答案 2 :(得分:1)

我最终使用你所有建议的混合物找到解决方案。问题是第一张表中的邮政编码末尾有一个隐藏的回车符。

/* See if any postal codes are more than 6 characters long. */
SELECT *, LEN(PostalCode)
FROM FirstTable
WHERE LEN(PostalCode) > 6

/* Find out the ASCII code for the hidden character. */
SELECT ASCII(RIGHT(PostalCode,1))
FROM FirstTable

/* Trimming hidden new line character (ASCII Code 13) from records. */
UPDATE FirstTable
SET PostalCode = REPLACE(PostalCode,CHAR(13),'')

谢谢大家!