Выберите, который находит, если несколько - PullRequest
0 голосов
/ 08 октября 2010

Я делаю внутреннее соединение между двумя таблицами, где одна является таблицей ассоциаций, поэтому существует отношение многие к одному. Я пытаюсь найти запрос, который может решить, существует ли ключ в соединении более одного раза, чем сохранять значение, кратное значению, в столбце обновления, но не уверен, что это эффективный способ сделать это:

SELECT 
  MainTable.Name 
FROM MainTable 
INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID 
WHERE 
  EXISTS (SELECT 
            COUNT(MainTable.AppID) 
          FROM MainTable 
          INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID 
          GROUP BY 
            MainTable.AppID 
          HAVING 
            (COUNT(MainTable.AppID)>1));

Проблема в том, что подзапрос захватывает правильные, имеющие дубликаты в appid, но основной запрос SELECT захватывает все имена appid, а не только те, которые существуют в подзапросе. Не уверены, что не так, поскольку подзапрос правильный?

Ответы [ 4 ]

1 голос
/ 08 октября 2010

Нет связи между элементами в основном запросе и элементами в подзапросе, поэтому запрос возвращает «все элементы, если есть какие-либо элементы, имеющие дубликаты».То, что вы хотите, это «все элементы, где есть дубликаты»:

SELECT 
  MainTable.Name 
FROM MainTable m
INNER JOIN ASSN_Main a ON m.AppID = a.AppID 
WHERE 
  EXISTS (SELECT AppID
          FROM ASSN_Main
          WHERE AppID = m.AppID
          GROUP BY AppID 
          HAVING COUNT(*)>1);
1 голос
/ 08 октября 2010

Я не знаю доступ к SQL, но что-то подобное будет работать в SQL Server:

SELECT  
   MainTable.Name  
FROM 
   MainTable  INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID  
WHERE  
   MainTable.AppID IN 
      (SELECT  
          MainTable.AppID  
       FROM MainTable  INNER JOIN ASSN_Main ON MainTable.AppID = ASSN_Main.AppID  
       GROUP BY  
          MainTable.AppID  
       HAVING  
          (COUNT(MainTable.AppID)>1)); 

Таким образом, в основном, заменить EXISTS на IN и вернуть AppID из подзапроса.

0 голосов
/ 08 октября 2010

Попробуйте изменить INNER JOIN на предложение WHERE.Когда вы изменяете его на WHERE, ASSN_Main в подзапросе будет ссылаться на таблицу из родительского запроса.

Здесь есть хороший обзор предложения EXISTS: http://www.techonthenet.com/sql/exists.php

0 голосов
/ 08 октября 2010

Я не совсем уверен, что вы пытаетесь сделать, но для отладки запросов Access в целом, я бы разбил его на несколько запросов, чтобы вы могли видеть, что происходит на каждом этапе.Затем, если хотите, вы можете объединить их в один запрос, который выполняет все шаги.

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