2012-10-12 24 views
0

我有定義爲這樣的表:查找行中的where子句

CREATE TABLE A_TEST (
    "ID" NUMBER NOT NULL ENABLE, 
    "TYPE" VARCHAR2(20 BYTE), 
) 
  • ID不是主鍵。
  • TYPE可能爲空
  • ID可以有0,1個或更多的TYPE。

,如果我想用型動物類型的ID,我會寫這個查詢:

SELECT distinct a1.ID FROM A_TEST a1 
    JOIN A_TEST a2 on a2.ID = a1.ID and a2.type != a1.type 

但我怎麼能找到IDS的,我有一個單一類型的定義?
(只有一行爲Id或許多行爲id,只有一個定義了類型)

+0

您是否可以擁有多個具有相同ID和相同類型的行? –

+0

不,這不應該是可能的 – Guillaume

+0

然後你應該添加'UNIQUE(ID,TYPE)'constarint。否則,數據庫將允許它。這個澄清兩個答案似乎都是正確的。 –

回答

3

的澄清後,似乎你的要求是:

SELECT ID 
FROM A_TEST 
GROUP BY ID  
HAVING COUNT(DISTINCT TYPE) = 1 
    OR COUNT(*) = 1 ; 
4

以下查詢將返回表中只有一個TYPE的所有ID。

SELECT ID FROM A_TEST 
WHERE TYPE IS NOT NULL -- since TYPE column can be NULL for a given ID. 
GROUP BY ID 
HAVING COUNT(*) = 1 

例如,

CREATE TABLE A_TEST (ID INT, TYPE INT) 
INSERT INTO A_TEST VALUES(1, NULL) 
INSERT INTO A_TEST VALUES(2, 0) 
INSERT INTO A_TEST VALUES(3, 0) 
INSERT INTO A_TEST VALUES(3, 1) 
INSERT INTO A_TEST VALUES(4, 1) 
INSERT INTO A_TEST VALUES(4, 1) 
INSERT INTO A_TEST VALUES(5, 0) 
INSERT INTO A_TEST VALUES(5, NULL) 

SELECT 
    ID 
FROM 
    A_TEST 
WHERE 
    TYPE IS NOT NULL -- since TYPE column can be NULL for a given ID. 
GROUP BY ID 
HAVING COUNT(ID) = 1 

結果

ID 
----------- 
2 
4 
(2 row(s) affected) 
+0

我沒有明白,但我可以回答原因。可能是因爲它是錯的。您的查詢將在表中顯示一行的ID,而不是一種類型的ID。 –

+0

@ypercube,謝謝你的迴應。 'GROUP BY'子句通過ID聚合行,由於一個類型意味着一行,它將顯示這些ID與一個記錄,其中TYPE列不爲空。 – Vikdor

+0

如果你有兩行,兩個都用'(4,1)'?結果中會顯示「4」嗎? –

3

這個例子考慮NULL值類型:

SELECT ID 
FROM A_TEST 
WHERE TYPE IS NOT NULL 
GROUP BY ID  
HAVING COUNT(DISTINCT TYPE)=1 

例如見SQL Fiddle

+0

+1。'WHERE TYPE IS NOT NULL'不是必需的。 –