2010-10-08 39 views
0

我正在做兩個表之間的內部聯接,其中一個是關聯表,所以存在多對一的關係。我想拿出那個可以決定是否對加盟的關鍵存在不止一個查詢一旦超過存儲在更新列中的值倍數,但不知道有效的方式來實現這一目標:選擇發現IF多個

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名稱,而不是僅存在於子查詢中的名稱。由於子查詢是正確的,不知道出了什麼問題?

回答

1

有在主查詢的項目,並在子查詢項目之間沒有任何關係,所以什麼該查詢返回的是「所有項目,如果有任何重複項目「。你想要的是「所有項目,其中有重複」:

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); 
0

我不太確定你在做什麼,但是爲了調試一般的Access查詢,我會把它分成多個查詢,這樣你就可以看到每一步發生了什麼。那麼如果你想要的話,你可以將它們合併成一個查詢來完成所有的步驟。

1

我不知道訪問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)); 

所以基本上取代了使用中是否存在,並從子查詢返回的AppID。

+0

工作就像一個魅力,我嘗試使用IN,但我想我的語法是錯誤 – Jake 2010-10-08 15:37:36

+0

但爲什麼沒有像預期 – Jake 2010-10-08 15:39:35

+0

子查詢的存在會工作某種程度上需要將它的結果集與主要查詢聯繫起來,以便它能夠按照你的意願做我想做的事情。無論如何,IN查詢在語義上更加正確 - 它更能表達你想要達到的目標(恕我直言)。 – 2010-10-08 15:47:31

0

嘗試將INNER JOIN更改爲WHERE子句。當您將其更改爲WHERE時,子查詢中的ASSN_Main將引用父查詢中的表。

還有的一個很好的概述EXISTS子句在這裏: http://www.techonthenet.com/sql/exists.php