假设我在MS-Access数据库中有一个名为ABC的表。
此表中有几列,但这个问题只有两列感兴趣 - “Hugo_symbol”和“Start_position”。 “Hugo_Symbol”具有基因名称,并且几行可以具有相同的Hugo_symbol - 意味着该列具有重复的条目。 “Start_position”包含数字 - 从1000到100000000之间的任何数字。
我想构建一个返回表ABC中的行的查询 1)拥有相同的Hugo_Symbol AND 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代码是什么?
答案 0 :(得分: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可以做什么,不能做什么。
答案 1 :(得分: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