Подзапрос SQL соответствует жестко закодированным критериям IN, но не подзапросу - PullRequest
0 голосов
/ 20 октября 2010

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

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 ]

2 голосов
/ 20 октября 2010

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

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

2 голосов
/ 20 октября 2010

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

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

0 голосов
/ 20 октября 2010

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

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

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

0 голосов
/ 20 октября 2010
SELECT * 
FROM demographics d 
WHERE d.person_id IN ( 
    SELECT person_id 
    FROM tests 
     WHERE test_code = 1234 
) 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...