代码之家  ›  专栏  ›  技术社区  ›  Matt Parker

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

  •  0
  • Matt Parker  · 技术社区  · 14 年前

    我有一群人参加了考试。我可以通过这个查询选择他们的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 回复  |  直到 14 年前
        1
  •  2
  •   Bob Jarvis - Слава Україні    14 年前

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

    分享和享受。

        2
  •  2
  •   Larry Lustig    14 年前

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

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

    其次,如果t.person_id返回任何空值,则不会得到任何结果。

        3
  •  0
  •   Wes Price    14 年前
    SELECT * 
    FROM demographics d 
    WHERE d.person_id IN ( 
        SELECT person_id 
        FROM tests 
         WHERE test_code = 1234 
    ) 
    

    在子查询中没有t.尝试过吗?在查看原始子查询时,不给表测试一个T的别名…

        4
  •  0
  •   Brian Driscoll    14 年前

    我从未在in子句中尝试过子查询,因此我不能保证此操作有效,但请尝试以下操作:

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

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