2013-07-04 52 views
0

假設有3個表:書籍,標籤和ASOCSQL聯接查詢每個匹配ASOC返回行

+----------+ +----------+ +----------+ 
|BOOKS  | |TAGS  | |ASOC  | 
+----------+ +----------+ +----------+ 
|book_id | |tag_id | |book_id | 
|book_name | |tag  | |tag_id | 
|...  | +----------+ +----------+ 
+----------+ 

希望使用/意圖在這個例子中是顯而易見的..

我要查詢符合特定標籤集的書籍。所以我嘗試這樣的:

SELECT B.book_name 
FROM BOOKS B 
,  TAGS T 
,  ASOC A 
WHERE B.book_id = A.book_id 
AND T.tag_id = A.tag_id 
AND (T.tag = 'Classic' OR T.tag = 'Fiction') 

我得到的不良結果是,每本書都被列出多次,每次標記ASOC條目一次。我只想要匹配的唯一書籍清單。我該怎麼做呢?

在此先感謝。

+0

您可以添加DISTINCT子句。 –

+0

MSDN [刪除具有不同重複行的文章](http://msdn.microsoft.com/zh-cn/library/ms187831%28v=sql.90%29.aspx)SQL代碼[http:// sqlfiddle.com/#!3/9a39a/1](http://sqlfiddle.com/#!3/9a39a/1) – deeg

回答

0

最簡單的方法是改變SELECT B.book_nameSELECT DISTINCT B.book_name;然而,它可能會寫得更好:

SELECT book_name 
    FROM books 
WHERE book_id IN 
     (SELECT book_id 
      FROM asoc 
      WHERE tag_id IN 
        (SELECT tag_id 
         FROM tags 
        WHERE tag IN ('Classic', 'Fiction') 
       ) 
     ) 
; 

其中查詢的結構使得您確實想要的更清晰。 (我建議在實際數據上都嘗試兩種方式;可能會比其他方式表現得更好)。

0

使用DISTINCT得到一個獨特的名單:

SELECT DISTINCT B.book_name 
FROM BOOKS B 
,  TAGS T 
,  ASOC A 
WHERE B.book_id = A.book_id 
AND T.tag_id = A.tag_id 
AND (T.tag = 'Classic' OR T.tag = 'Fiction') 

作爲進一步的增強,最後一行可以改寫稍微更具可讀性:

AND T.tag IN ('Classic', 'Fiction') 

您也可以使JOIN的更高效:

SELECT DISTINCT B.book_name 
FROM BOOKS B 
     INNER JOIN ASOC A on B.book_id = A.book_id 
     INNER JOIN TAGS T on A.tag_id = T.tag_id 
WHERE T.tag IN ('Classic', 'Fiction') 
0

你說你想「匹配一組標籤」。如果我把它理解爲「所有標籤」,那麼這是一個「set-set-set」查詢。我喜歡解決這些使用聚合:

SELECT B.book_name 
FROM BOOKS B join 
     ASOC A 
     on B.book_id = A.book_id 
     TAGS T 
     on T.tag_id = A.tag_id 
group by B.book_name 
having sum(case when t.tag = 'Classic' then 1 else 0 end) > 0 and 
     sum(case when t.tag = 'Fiction' then 1 else 0 end) > 0; 

having子句計數每個標籤的出現的次數。該比較要求兩個標籤都在該集合中。

順便說一句,如果你想要標籤匹配的書籍,只需將and更改爲or。我喜歡這種方法的原因是因爲查詢非常靈活。只需更改having子句即可表達許多不同的條件。

我也改變了你的查詢使用ANSI標準連接語法。你應該學會使用這種語法編寫查詢。