2011-06-28 58 views
1

我在寻找一个访问查询,但是一个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这很容易但是,我不想整行。我想选择“组”。该组可以通过​​3210(或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

你可以在Access中使用子查询 – BonyT

回答

2

提出您的表行与包括= 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存在”:

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:

Difference between EXISTS and IN in SQL?

+0

如果组中的多行包含设置为1,那么您的查询将多次返回所需的行。 – BonyT

+0

这是正确的,我添加了一个独特的主要选择。 –

+0

这是为我假设的SQL服务器。如果您不介意,我将首先尝试访问查询。我不知道为什么有人低估了你,但我把它带回来了。 – masfenix

1

你需要一个子查询 - 如下:

SELECT * 
FROM tablename 
WHERE nameid IN 
    (
     SELECT DISTINCT nameid 
     FROM tablename 
     WHERE include = 1 
    ) 
0
SELECT * FROM yourTable WHERE nameid IN (SELECT DISTINCT nameid FROM yourTable WHERE include=1) 

你做的是什么,选择的每一行,其填充NameID在你的子查询中。 子查询为include=1的行选择nameid。

+1

这很好,但访问速度很慢。我有大约24000行。 – masfenix

+0

你说你没有索引。为什么不添加索引? –

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;