2011-02-28 50 views
1

我有這個表(簡體)SQL查詢來發現IDS其中字段1 = x和字段1 = Y

ID | Field1 
--------------------------------- 
2 | Cat  
2 | Goat 
6 | Cat 
6 | Dog 

我需要找到一個記錄存在,其對於FIELD1值的ID是貓和同id,另一個記錄的價值是山羊。在這種情況下,它只會返回ID 2.

做下面的事情不會奏效。 Where Field1 ='Cat'and Field1 ='Goat'

我猜我需要某種子查詢嗎?我不完全確定。 (使用SQL Server 2008)

回答

2

用途:

SELECT t.id 
    FROM YOUR_TABLE t 
    WHERE t.field1 IN ('Cat', 'Goat') 
GROUP BY t.id 
    HAVING COUNT(DISTINCT t.field1) = 2 

這裏的關鍵是使用COUNT(DISTINCT ...),以獲得field1值的計數。如果用戶擁有Cat 3x和狗1x,則無關緊要,除非您需要過濾掉這些內容?

另一種選擇是INTERSECT, which returns any distinct values that are returned by both the query on the left and right sides of the INTERSECT operand

SELECT a.id 
    FROM YOUR_TABLE a 
WHERE a.field1 = 'Cat' 
INTERSECT 
SELECT b.id 
    FROM YOUR_TABLE b 
WHERE b.field1 = 'Goat' 
+0

謝謝,我喜歡使用Intersect的簡單性。這種方法比使用group by/having的查詢效率低嗎? – 2011-02-28 02:14:43

+1

@James與HAVING相比,INTERSECT表現較差的情況多於反之。第三個選項JOIN(Cyber​​nate)也可以比INTERSECT表現更好,但仍然比HAVING慢。它看起來很漂亮,但如果你想要表演,遠離它。 – RichardTheKiwi 2011-02-28 02:45:52

0

未經測試,但這樣的事情可能會奏效

select t1.ID from tbl t1 inner join tbl t2 on t1.ID=t2.ID 
where (t1.Field1='Cat' and t2.Field1='Goat') 
2

試試這個:

SELECT id FROM 
(
SELECT id FROM <YOUR_TABLE> WHERE Field1 = 'Cat' 
INTERSECT 
SELECT id FROM <YOUR_TABLE> WHERE Field1 = 'Goat' 
) a 

備選:

SELECT a.ID 
    FROM <YOUR_TABLE> a INNER JOIN <YOUR_TABLE> b 
    ON a.ID = b.ID 
WHERE a.Field1 = 'CAT' 
    AND b.Field1 = 'GOAT' 
+0

JOIN似乎過分 - 當您在單個查詢中只需要GROUP BY&HAVING子句時,兩次遍歷表格。 – 2011-02-28 02:09:57

+0

這就是爲什麼我給它作爲備選方案..如果OP不知道INTERSECT .. – Chandu 2011-02-28 02:13:06

+0

@omg,@cyb有些情況下JOIN會更快。如果其中一個值出現的次數是其他值的20倍,HAVING將收集所有數據,而JOIN將以較小的值開始,書籤查找記錄並按另一個值過濾。 – RichardTheKiwi 2011-02-28 02:47:25

0

使用這樣的查詢

SELECT ID FROM table INNER JOIN 
    (SELECT ID, COUNT(FILED1) AS Expr1 
     FROM table GROUP BY ID 
      HAVING COUNT(FIELD1) > 1) SR ON table.ID = SR.ID WHERE table.FIELD1 = 'Cat' 

所以你只要把一個變量與申報的「貓」,如果你想有一個更動態查詢

0
SELECT DISTINCT t1.ID 
FROM table t1, table t2 
WHERE t1.ID=t2.ID AND t1.Field1 <> t2.Field1 
相關問題