2011-02-28 89 views
-1

嗨我在編寫查詢時遇到了問題。我會很樂意收到一些建議!SQL查詢的WHERE子句中的許多條件

我的表格被稱爲TagObjects;它有5列,但問題的3個重要問題是:tob_tag,tob_object和tob_objectType。

我需要實現的查詢如下:具有未知數量的對(tob_object,tob_objectType)我需要知道所有對具有共同的所有tob_tag。

我跟這個查詢嘗試(該數字只是爲例):

SELECT "TagsObjects"."tob_tag" 
FROM "TagsObjects" 
WHERE TRUE 
AND ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
AND ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
GROUP BY "TagsObjects"."tob_tag"; 

的WHERE TRUE是存在的,因爲我是動態生成的查詢。這個查詢適用於一對(WHERE子句中的一個AND),當我用兩對(如我上面發佈的示例)嘗試它時,它不返回任何行(並且數據在那裏!)。

如果有人知道我做錯了什麼或者做什麼的方法,這將是一個大幫助!

使用PostgreSQL 9.0.1。

+0

丟掉TRUE;通過OR來代替AND來加入替代品。 並將SQL關鍵字(如FROM,WHERE和GROUP BY)放在行首。 – 2011-02-28 23:48:36

+0

@Jonathan,你可以責怪我糟糕的格式。我添加了換行符(SQL片段最初是一行),但沒有將它們添加到最佳位置。我現在要解決這個問題。 – 2011-02-28 23:52:00

+0

YOu需要使用OR而不是AND作爲您的查詢的一部分... TRUE AND((..)OR(..)OR(..)) – MatBailie 2011-03-01 01:18:37

回答

1

讓我們從什麼是錯的開始。您試圖在「TagsObjects」,「tob_object」= 8和「TagsObjects」中找到一行,「tob_object」= 9.「TagsObjects」。「tob_object」不能同時出現,因此不能同時返回行。

你應該怎麼做呢?

從你的規範我收集到有幾對(「TagsObjects」,「tob_object」,「TagsObjects」。「tob_objectType」),其中兩個字段都不是常量。您想要創建每對返回的所有行的聯合。

WITH matchingTagsObjects AS (
    SELECT "TagsObjects"."tob_tag" 
    FROM "TagsObjects" 
    WHERE ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
    UNION ALL 
    SELECT "TagsObjects"."tob_tag" 
    FROM "TagsObjects" 
    WHERE ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
) 
SELECT "TagsObjects"."tob_tag" 
FROM matchingTagsObjects 
GROUP BY "TagsObjects"."tob_tag"; 

命名的子查詢matchingTgsObjects列出了對(8,1)和(8,2)找到的所有tob_tags。在主查詢中選擇實際標記,並使用group by子句選擇不同的tob_tags,與您的解決方案一樣。我使用了UNION ALL,因爲分組是在主查詢中完成的,並且我沒有找到任何理由在此時刪除子查詢中的重複行。您可以通過從UNION ALL中刪除ALL來實現這一點。

您也可以直接在子部分中包含子查詢,而不是使用命名子查詢。

還有一種替代方法,您在where子句中使用OR條件,如WHERE(匹配對A)或(匹配B對)。如果他看到了這個用法,我的一個同事就會發生衝突:當在這種情況下需要OR來進行匹配時,它會告訴我們可能需要用實際模型來完成某些工作。

+0

作爲此附錄 - 請特別提供預期的輸入數據和內容你期望輸出是。 – 2011-02-28 23:47:29

+0

命名的子查詢可以通過合併查詢通過'tob_object'或'tob_objecttype':'WHERE'TagsObjects「。」「tob_objecttype」= 1 AND「TagsObjects」。「tob_object」IN(8,9)'' – 2011-03-01 00:01:27

2

在構建您的可選條款,做他們使用這種模式

SELECT 「TagsObjects」。 「tob_tag」
FROM 「TagsObjects」
WHERE FALSE
OR( 「TagsObjects」。 「tob_object」= 8 AND 「TagsObjects」。 「tob_objecttype」= 1)
OR( 「TagsObjects」。 「tob_object」= 9 AND 「TagsObjects」。 「tob_objecttype」= 1)
GROUP BY 「TagsObjects」。「tob_tag」;

但是,如果沒有條件的話,那麼加OR TRUE到列表中,因此它成爲

SELECT 「TagsObjects」。 「tob_tag」
FROM 「TagsObjects」
WHERE FALSE
OR TRUE
GROUP BY「TagsObjects」。「tob_tag」;

至於這部分

我需要知道所有的tob_tag所有對有共同之處。

如果你只是想有 8/1和9/1(或多個組合)tob_tags,那麼你需要一個GROUP BY和HAVING子句。

SELECT "TagsObjects"."tob_tag" 
FROM "TagsObjects" 
WHERE FALSE 
OR ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1) 
OR ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1) 
GROUP BY "TagsObjects"."tob_tag" 
HAVING COUNT(*) = 2;