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

まず、テストを適切にエイリアシングしていません。する必要があります:

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 に答える
2

問題は、VARCHAR ではなく CHAR として宣言されているため、TESTS.PERSON_ID の末尾に空白が含まれている可能性があります。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 に答える
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 に答える