SQL子查询匹配硬编码的条件,但不匹配子查询

SQL子查询匹配硬编码的条件,但不匹配子查询,sql,sql-server-2005,subquery,in-subquery,Sql,Sql Server 2005,Subquery,In Subquery,我有一群人参加了考试。我可以通过此查询选择他们的ID: SELECT person_id FROM tests WHERE test_code = 1234 我想从人口统计表中提取这些个人的记录,所以我尝试了以下子查询: SELECT * FROM demographics d WHERE d.person_id IN ( SELECT t.person_id FROM tests t WHERE t.test_code = 1234 ) 。。。但我没有得到任何结果。

我有一群人参加了考试。我可以通过此查询选择他们的ID:

SELECT person_id
FROM tests
WHERE test_code = 1234
我想从人口统计表中提取这些个人的记录,所以我尝试了以下子查询:

SELECT *
FROM demographics d
WHERE d.person_id IN (
    SELECT t.person_id
    FROM tests t
    WHERE t.test_code = 1234
)
。。。但我没有得到任何结果。如果我从(功能)子查询中获取几个ID,并将它们硬编码到IN条件中:

SELECT *
FROM demographics d
WHERE d.person_id IN (01123, 58132)
。。。查询是有效的。我肯定错过了一些非常基本的东西——你知道它是什么吗

可能的复杂因素:t.person\u id为char13,d.person\u id为varchar50。这是MS SQL Server 9.0.4035;我在SQLServer管理工作室工作


提前感谢您的帮助

问题可能是TESTS.PERSON\u ID后面有空格,因为它被声明为CHAR而不是VARCHAR。我不确定如何删除SQL Server中的尾随空格(我使用它已经有一段时间了),但在Oracle中,我会使用TRUNC函数,如中所示

SELECT * 
  FROM demographics d 
  WHERE d.person_id IN ( 
    SELECT TRUNC(t.person_id )
      FROM tests t 
      WHERE t.test_code = 1234 ) 
编辑:我相信SQL Server中的等效函数是RTRIM


共享和享受。

问题可能是TESTS.PERSON\u ID后面有空格,因为它被声明为CHAR而不是VARCHAR。我不确定如何删除SQL Server中的尾随空格(我使用它已经有一段时间了),但在Oracle中,我会使用TRUNC函数,如中所示

SELECT * 
  FROM demographics d 
  WHERE d.person_id IN ( 
    SELECT TRUNC(t.person_id )
      FROM tests t 
      WHERE t.test_code = 1234 ) 
SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    SELECT person_id 
    FROM tests 
     WHERE test_code = 1234 
) 
编辑:我相信SQL Server中的等效函数是RTRIM

分享和享受

SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    SELECT person_id 
    FROM tests 
     WHERE test_code = 1234 
) 
你有没有试过不用t。在子查询中?在查看原始子查询时,不给表测试t的别名


你有没有试过不用t。在子查询中?在查看原始子查询时,您没有给表测试别名t…。

我从未在in子句中尝试过子查询,因此我不能保证这是有效的,但请尝试以下方法:

SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    (SELECT t.person_id 
    FROM t.tests 
    WHERE t.test_code = 1234) 
) 

我只是在子查询周围添加了括号,这是常见的做法。再说一次,我从未在in子句中尝试过子查询,因此不能保证这是可行的,但值得一试。

我从未在in子句中尝试过子查询,因此我不能保证这是可行的,但请尝试以下方法:

SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    (SELECT t.person_id 
    FROM t.tests 
    WHERE t.test_code = 1234) 
) 

我只是在子查询周围添加了括号,这是常见的做法。再说一次,我从未在in子句中尝试过subq,所以不能保证它有效,但值得一试。

首先,您没有正确地进行别名测试。应该是:

SELECT *
FROM demographics d
WHERE d.person_id IN (
    SELECT t.person_id
    FROM **tests t**
    WHERE t.test_code = 1234
)

其次,如果t.person\u id返回任何空值,您将不会得到任何结果。

首先,您没有正确地进行别名测试。应该是:

SELECT *
FROM demographics d
WHERE d.person_id IN (
    SELECT t.person_id
    FROM **tests t**
    WHERE t.test_code = 1234
)

其次,如果t.person\u id返回任何空值,您将不会得到任何结果。

Oracle:TRUNC(t.person\u id)SQL:LTRIM(RTRIM(t.person\u id))@Vidar,@ig0774:我查过了,你们都是对的;LTRIM(RTRIM(…)相当于Oracle的TRUNC,但RTRIM才是真正需要的。谢谢。:-)我相信这就是问题所在。SQL Server trim函数是LTRIM和RTRIM。尝试使用('01123','58132')作为IN子句的参数进行硬编码查询以进行验证。实际上,它的前导是零。人口统计ID的正面都有三个零。。。嗯,但这让我想到了正确的事情。谢谢Oracle:TRUNC(t.person_id)SQL:LTRIM(RTRIM(t.person_id))@Vidar,@ig0774:我查了一下,你们都对了;LTRIM(RTRIM(…)相当于Oracle的TRUNC,但RTRIM才是真正需要的。谢谢。:-)我相信这就是问题所在。SQL Server trim函数是LTRIM和RTRIM。尝试使用('01123','58132')作为IN子句的参数进行硬编码查询以进行验证。实际上,它的前导是零。人口统计ID的正面都有三个零。。。嗯,但这让我想到了正确的事情。谢谢空值仅对
不在
中有此影响抱歉,这只是一个输入错误。“不过,要注意细节。”马丁——谢谢你,我的观点是正确的。我最常用的数据库没有根据SQL标准实现空值问题,这是我通常很欣赏的。直到最近,SQLite3也做了同样的事情。NULLs只对
有这种影响,而不是在
中。对不起,这只是一个输入错误。“不过,要注意细节。”马丁——谢谢你,我的观点是正确的。我最常用的数据库没有根据SQL标准实现空值问题,这是我通常很欣赏的。直到最近,SQLite3都是这样做的。是的,我验证了子查询的工作方式与我在这里写的不完全一样——Larry在我的表别名中发现了一个拼写错误。是的,我验证了子查询的工作方式与我在这里写的不完全一样——Larry在我的表别名中发现了一个拼写错误。