需要访问查询

时间:2011-06-28 15:28:07

标签: sql-server-2008 ms-access

我正在寻找一个访问查询,但是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

4 个答案:

答案 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存在的原因:

Difference between EXISTS and IN in SQL?

答案 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

的行选择nameid