2013-03-08 121 views
1

我試圖拔出從一個SQL Server數據庫的一些信息(使用SQL Server Management Studio中)這樣的語句:SQL服務器加入

SELECT DISTINCT(t1.accountid), 
       t1.accountname, 
       t1.reseller, 
       (SELECT t1.reseller 
       FROM dbname t1 
         INNER JOIN dbname t2 
           ON t1.reseller = t2.reseller 
       WHERE t1.reseller IN (1)) AS Reseller 
FROM dbname t1, 
     dbname t2 

運行這給了我的錯誤:

子查詢返回的值超過1。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

經過大量的研究,我仍然難倒了。和幫助將不勝感激。謝謝。

+1

[不良習慣踢:使用舊樣式的JOIN(http://sqlblog.com/blogs/aaron_bertrand/archive/2009 /10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表已停用ANSI - ** 92 ** SQL標準(** 20年**前!) – 2013-03-08 16:58:12

+1

如果經銷商在兩個表中匹配,輸出兩次的意義何在?此外,爲什麼你明確加入子查詢,然後*再次*但***含蓄***([這是壞!](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08) /bad-habits-to-kick-using-old-style-joins.aspx))在外部查詢? – 2013-03-08 16:58:42

+0

另外,自加入AT ALL的要點是什麼?你可以顯示幾行樣本數據和期望的結果嗎?我開始制定一個答案,但最初的嘗試存在很多錯誤,因此無法確定此查詢實際上應該做什麼。 – 2013-03-08 17:03:05

回答

3
  1. 不能應用DISTINCT爲單個列,我不知道它在這裏需要在所有除非你的表格可以在所有這些列的重複值。
  2. 我不知道你爲什麼加入這些表兩次,或使用子查詢。
  3. 我不知道你爲什麼要輸出t1.reseller兩次......即使你使用了t1t2中的一個,因爲它們在連接上匹配,它們對於每一行都是一樣的!
  4. 你有一個隱含的連接你缺少一個where子句 - 這導致了一個笛卡爾積,並且是exactly why I always recommend against this syntax。也許這是什麼引發了DISTINCT的使用?
  5. 從t2開始你似乎沒有使用任何列。 (雙)自連接的要點是什麼?

好像所有你需要的是:

SELECT accountid, accountname, reseller 
    FROM dbo.dbname 
    WHERE reseller = 1; 

否則請描述正是您的查詢是應該做的(通過展示樣本數據和期望的結果)。

-1

你得到的錯誤是因爲此查詢:

  (SELECT t1.reseller 
      FROM dbname t1 
        INNER JOIN dbname t2 
          ON t1.reseller = t2.reseller 
      WHERE t1.reseller IN (1)) AS Reseller) 

將返回多個值。

+2

答案通常不會提出如何解決?除了代碼塊,這感覺就像是對我的評論。 – 2013-03-08 16:56:52

0

附加TOP 1子句中的子查詢

如下

 (SELECT TOP 1 t1.reseller 
     FROM dbname t1 
       INNER JOIN dbname t2 
         ON t1.reseller = t2.reseller 
     WHERE t1.reseller IN (1)) AS Reseller)