необходим запрос доступа - PullRequest
1 голос
/ 28 июня 2011

Я ищу запрос на доступ, но SQL Server 2008 может быть достаточно, так как я могу использовать функцию сквозного доступа в доступе.

Мои данные выглядят так.

--------------------------------------------------------------
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 ]

2 голосов
/ 28 июня 2011

Я думаю, что этот запрос идентифицирует значения 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 голосов
/ 28 июня 2011

Запросите в таблице строку с include = 1.

Затем снова объедините с таблицей, чтобы все строки соответствовали имени первого запроса:

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
   )

Вы могли видетьразница здесь:

Может ли INNER JOIN предложить лучшую производительность, чем EXISTS

И почему вы должны использовать Where, когда у вас есть фильтр с большим количеством идентификаторов:

Разница между EXISTS и IN в SQL?

1 голос
/ 28 июня 2011

Вам нужен подзапрос - следующим образом:

 SELECT *
 FROM tablename 
 WHERE nameid IN
   (
      SELECT DISTINCT nameid 
      FROM tablename 
      WHERE include = 1
   )
0 голосов
/ 28 июня 2011
SELECT * FROM yourTable WHERE nameid IN (SELECT DISTINCT nameid FROM yourTable WHERE include=1)

Что вы делаете, выбирайте каждую строку, имя которой есть в вашем подзапросе.Подзапрос выбирает nameid для строк, где include=1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...