1

MS-Access データベースに ABC というテーブルがあるとします。

この表にはいくつかの列がありますが、この質問に関係するのは、"Hugo_symbol" と "Start_position" の 2 つの列だけです。「Hugo_Symbol」には遺伝子名があり、複数の行が同じ Hugo_symbol を持つ場合があります。つまり、この列には重複したエントリがあります。「Start_position」には、1000 から 100000000 までの数字があります。

テーブル ABC から、1) 同じ Hugo_Symbol を持ち、かつ 2) Start_position が互いに 20 以内の行を返すクエリを作成したいと考えています。

たとえば、クエリは次のように返されます。

Hugo_Symbol         Start_Position

TP53                      987654
TP53                      987660
TP53                      987662
APOB                      12345
APOB                      12350
APOB                      12359

これらの行は同じ Hugo_Symbol を持ち、Start_Position は互いに 20 以内であるためです。

そのようなクエリは可能ですか?もしそうなら、SQLコードは何でしょうか?

4

2 に答える 2

3

私は Access を使用しませんが、これが ANSI SQL でアプローチする方法です。

SELECT
  *
FROM
  ABC    AS first
INNER JOIN
  ABC    AS second
    ON  second.Hugo_Symbol     = first.Hugo_Symbol
    AND second.Start_Position <= first.Start_Position + 20
    AND second.Start_Position >  first.Start_Position

これにより、予想よりも多くのデータが返される可能性があり、予想とは異なる形式が返される可能性があります。

First.Hugo_Symbol First.Start_Position Second.Hugo_Symbol Second.Start_Position
     TP53              987654                TP53              987660
     TP53              987654                TP53              987662
     TP53              987660                TP53              987662
     APOB              12345                 APOB              12350
     APOB              12350                 APOB              12359
     APOB              12350                 APOB              12359

編集:

上記の回答は「お互い」の影響が大きいです。

要件を「同じシンボルと 20 の独自の位置を持つ別のレコードが存在するすべてのレコード」として改革すると、次のようなものが得られます...

SELECT
  *
FROM
  ABC     AS data
WHERE
  EXISTS (SELECT *
            FROM ABC AS lookup
           WHERE lookup.hugo_symbol     = data.hugo_symbol
             AND lookup.start_position >= data.start_position - 20
             AND lookup.start_position <= data.start_position + 20
             AND lookup.start_position <> data.start_position
         )

しかし、Access2000 は、私が通常使用するデータベースよりも制限があります。Access2000 で何ができて何ができないのかわかりません。

于 2012-09-11T20:32:28.090 に答える
2
SELECT ABC.Hugo_Symbol, ABC.Start_Position, ABC_1.Start_Position
FROM ABC INNER JOIN ABC AS ABC_1 ON 
   ABC.Hugo_Symbol = ABC_1.Hugo_Symbol AND 
   ABC.Start_Position + 20 >= ABC_1.Start_Position AND
   ABC.Start_Position < ABC_1.Start_Position
于 2012-09-11T20:47:51.807 に答える