2011-06-28 61 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;