Подзапрос SQL соответствует жестко закодированным критериям IN, но не подзапросу

У меня есть группа людей, которые прошли тест. Я могу выбрать их идентификаторы с помощью этого запроса:

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
)

... но я не получаю никаких результатов. Если я возьму пару идентификаторов из (функционального) подзапроса и жестко закодирую их в критерии 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 ответа

Решение

Проблема может заключаться в том, что 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.

Поделитесь и наслаждайтесь.

Во-первых, вы не используете псевдонимы для тестов должным образом. Должно быть:

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, вы не получите никаких результатов.

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

Вы пробовали это без т. в подзапросе? как глядя на ваш исходный подзапрос, вы не даете таблицу тестирует псевдоним t...

Я никогда не пробовал подзапрос в предложении IN, поэтому я не могу гарантировать, что это работает, но попробуйте это:

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

Я просто добавил круглые скобки вокруг вашего подзапроса, что является обычной практикой. Опять же, я никогда не пробовал использовать subq в предложении IN, поэтому не могу гарантировать, что это работает, но оно того стоит.

Другие вопросы по тегам