我正在寻找一个访问查询,但是sql server 2008就足够了,因为我可以在访问中使用passthrough功能。
我的数据看起来像这样。
--------------------------------------------------------------
id nameid name score diff include
--------------------------------------------------------------
1 0001 SO 100 0 0
2 0001 SO 100 0 0
3 0001 SO 100 0 0
4 0001 SO 100 0 0
5 0001 SO 100 0 0
6 0001 SO 100 0 0
7 0002 MO 10 0 0
8 0002 MO 18 0 1
9 0002 MO 20 0 0
10 0002 MO 14 0 0
11 0002 MO 100 0 0
11 0002 MO 100 0 0
12 0003 MA 10 0 0
13 0003 MA 18 0 1
14 0003 MA 20 0 0
15 0003 MA 14 0 0
16 0003 MA 100 0 1
17 0003 MA 100 0 0
现在我想要的是遍历每一行,只选择include = 1
所在的行。 这很容易然而,我不想要整行..我想选择“组”。该群组可以通过nameid
(或name
)进行标识。
所以对于上面我想要以下结果:
--------------------------------------------------------------
id nameid name score diff include
--------------------------------------------------------------
7 0002 MO 10 0 0
8 0002 MO 18 0 1
9 0002 MO 20 0 0
10 0002 MO 14 0 0
11 0002 MO 100 0 0
11 0002 MO 100 0 0
12 0003 MA 10 0 0
13 0003 MA 18 0 1
14 0003 MA 20 0 0
15 0003 MA 14 0 0
16 0003 MA 100 0 1
17 0003 MA 100 0 0
答案 0 :(得分:2)
向您的表格询问包含include = 1的行。
然后再次与表连接,使所有行对应第一个查询的nameid:
SELECT DISTINCT m.*
FROM myTable m
INNER JOIN myTable m2
ON m.nameid = m2.nameid
AND m2.include = 1
对于大量数据,连接查询比“in”查询更有效。你仍然需要字段'nameid'的索引,而'include'也不会受到伤害。
等效于'WHERE EXISTS':
SELECT m.*
FROM myTable m
WHERE EXISTS
(
SELECT *
FROM myTable m2
WHERE m2.include = 1
AND m2.nameid = m.nameid
)
你可以在这看到区别:
Can an INNER JOIN offer better performance than EXISTS
当你有一个包含大量ID的过滤器时,你必须使用Where存在的原因:
答案 1 :(得分:2)
我认为此查询标识了您希望包含在主查询中的nameid值。
SELECT DISTINCT nameid
FROM YourTable
WHERE include = 1;
如果确实如此,请将其作为子查询合并,并使用INNER JOIN和YourTable仅返回nameid值与include = 1
...相关联的那些行。在表的任何行中。
SELECT id, nameid, name, score, diff, include
FROM
YourTable AS y
INNER JOIN (
SELECT DISTINCT nameid
FROM YourTable
WHERE include = 1
) AS q
ON y.nameid = q.nameid;
Access查询设计器可能会用方括号加上一个点代替括起子查询的括号。
SELECT id, nameid, name, score, diff, include
FROM
YourTable AS y
INNER JOIN [
SELECT DISTINCT nameid
FROM YourTable
WHERE include = 1
]. AS q
ON y.nameid = q.nameid;
答案 2 :(得分:1)
您需要一个子查询 - 如下所示:
SELECT *
FROM tablename
WHERE nameid IN
(
SELECT DISTINCT nameid
FROM tablename
WHERE include = 1
)
答案 3 :(得分:0)
SELECT * FROM yourTable WHERE nameid IN (SELECT DISTINCT nameid FROM yourTable WHERE include=1)
您要做的是,选择其名称在子查询中的每一行。
子查询为include=1
。