0

我有一群人参加了考试。我可以使用以下查询选择他们的 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_id 是 char13,d.person_id 是 varchar50。这是 MS SQL Server 9.0.4035;我在 SQL Server Management Studio 工作。

4

4 回答 4

2

问题可能是 TESTS.PERSON_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。

于 2010-10-20T17:05:32.840 回答
2

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

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

其次,如果 t.person_id 返回任何 NULL,您将不会得到任何结果。

于 2010-10-20T17:09:51.693 回答
0
SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    SELECT person_id 
    FROM tests 
     WHERE test_code = 1234 
) 

你试过没有 t. 在子查询中?在查看您的原始子查询时,您没有给表测试一个别名 t...

于 2010-10-20T17:06:01.633 回答
0

我从来没有在 IN 子句中尝试过子查询,所以我不能保证这行得通,但试试这个:

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

我只是在您的子查询周围添加了括号,这是常见的做法。同样,我从来没有在 IN 子句中尝试过 subq,所以不能保证它有效,但值得一试。

于 2010-10-20T17:06:55.287 回答