我有一群人接受了考试。我可以使用此查询选择他们的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中工作。
提前感谢您的帮助!
答案 0 :(得分: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。
分享并享受。
答案 1 :(得分: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,则不会得到任何结果。
答案 2 :(得分:0)
SELECT *
FROM demographics d
WHERE d.person_id IN (
SELECT person_id
FROM tests
WHERE test_code = 1234
)
你有没有尝试过它。在子查询中?在查看原始子查询时,不给表格测试别名为...
答案 3 :(得分: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,所以不能保证这个有用,但值得一试。