1

假设我在 MS-Access 数据库中有一个名为 ABC 的表。

此表中有几列,但这个问题只有两列感兴趣 - “Hugo_symbol”和“Start_position”。“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 回答