我在Oracle DB中具有下表。SQL檢查列中的所有值
ID VALUE
-----------
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
4 1
如何選擇的ID裏面有所有3個值(1,2,3)
我在Oracle DB中具有下表。SQL檢查列中的所有值
ID VALUE
-----------
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
4 1
如何選擇的ID裏面有所有3個值(1,2,3)
試試這個:
SELECT ID
FROM TABLENAME T
WHERE EXISTS (SELECT *
FROM TABLENAME T1
WHERE T1.ID = T.ID AND T1.VALUE = '1')
AND EXISTS (SELECT *
FROM TABLENAME T2
WHERE T1.ID = T.ID AND T2.VALUE = '2')
AND EXISTS (SELECT *
FROM TABLENAME T3
WHERE T1.ID = T.ID AND T2.VALUE = '3')
或
SELECT ID
FROM TABLENAME T
WHERE (SELECT COUNT(*)
FROM (SELECT VALUE
FROM TABLENAME T1
WHERE T1.ID = T.ID
GROUP BY VALUE)) = 3;
,其中3號的值可以通過
SELECT COUNT(*)
FROM TABLENAME T1
GROUP BY VALUE
所以這將是通用:
SELECT ID
FROM TABLENAME T
WHERE (SELECT COUNT(*)
FROM (SELECT VALUE
FROM TABLENAME T1
WHERE T1.ID = T.ID
GROUP BY VALUE)) = (SELECT COUNT(*)
FROM TABLENAME T2
GROUP BY VALUE)
有效,但過於複雜 - 答案可以在單個「SELECT」語句中完成。此外,您的別名需要更正 – 2012-07-27 03:51:00
仍然過於複雜 - 您不需要子查詢。提示:'HAVING' – 2012-07-27 03:53:48
我試過這個..但是我得到所有行,即使它沒有所有的值1,2和3 – user1556549 2012-07-27 03:55:46
下面是一個選項... HAVING子句中每個表達式計數被發現等於1,2或3,如果任何值的數量這些計數小於1,那麼ID將不會被返回。
http://sqlfiddle.com/#!4/00fdc/8
SELECT ID
FROM myTable
GROUP BY ID
HAVING
SUM(DECODE(VALUE, 1, 1, 0)) > 0 AND
SUM(DECODE(VALUE, 2, 1, 0)) > 0 AND
SUM(DECODE(VALUE, 3, 1, 0)) > 0
EDIT - 規定值1,2或3個:
SELECT ID
FROM myTable
GROUP BY ID
HAVING
SUM(DECODE(VALUE, 1, 1, 0)) > 0 AND
(
SUM(DECODE(VALUE, 2, 1, 0)) > 0 OR
SUM(DECODE(VALUE, 3, 1, 0)) > 0
)
方式過於複雜 – 2012-07-27 03:56:16
那麼爲什麼不向我們展示它是如何完成的? – 2012-07-27 03:57:54
查看我的提示hmmftg – 2012-07-27 03:58:26
選擇ID作爲'v1',
總和(當值= 2然後1其他0結束的情況)作爲'v2',
總和(當值= 3然後1其他0結束的情況)作爲'v3'
由ID ORAC組)作爲最終
其中,V1> 0且V2> 0和v3> 0
有了這個選項,你會得到更多的比的ID,到你的應用程序選擇您想要的列:
SELECT ID,
sum(CASE WHEN VALUE = 1 THEN 1 ELSE 0 END) AS ONE,
sum(CASE WHEN VALUE = 2 THEN 1 ELSE 0 END) AS TWO,
sum(CASE WHEN VALUE = 3 THEN 1 ELSE 0 END) AS THREE
FROM MYTABLE
GROUP BY ID
HAVING ONE >= 1 AND TWO >= 1 AND THREE >= 1;
或者,如果你的情況是特定的(只值1,2,3是可能的,而且沒有重複值是允許的),那麼你可以嘗試以下操作之一:
SELECT ID,
count(VALUE) AS VALUECOUNT
FROM MYTABLE
GROUP BY ID
HAVING VALUECOUNT = 3;
我會以ca重新開始之前,如果您稍後想要添加其他值,則可能會產生副作用。但是,如果您目前的案例符合上述限制條件,仍然值得提出建議。
,當然,如果你不喜歡這些取中間數的想法,我圍內的另一選擇
SELECT ID FROM (
...
)
最簡單的方式給了查詢一般是這樣的
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 1 id, 1 val from dual union all
3 select 1 id, 2 val from dual union all
4 select 1 id, 3 val from dual union all
5 select 2 id, 1 val from dual union all
6 select 2 id, 2 val from dual union all
7 select 3 id, 1 val from dual union all
8 select 3 id, 2 val from dual union all
9 select 3 id, 3 val from dual union all
10 select 4 id, 1 val from dual
11 )
12 select id
13 from x
14 where val in (1,2,3)
15 group by id
16* having count(distinct val) = 3
SQL>/
ID
----------
1
3
WHERE
子句標識您感興趣的值。HAVING
子句告訴您需要存在多少這些值。例如,如果您想要所有具有3個值中的至少2個的行,則會更改HAVING
子句以查找COUNT
爲2。
如果一個特定的val
保證每id
最多發生一次,則可以消除HAVING
子句中的distinct
。
非常好的建議 – 2012-07-27 05:08:14
值字段是否包含1,2,3以外的任何內容? – hmmftg 2012-07-27 04:16:52
標題是** SQL檢查列**或** SQL中的所有值以檢查列**中的特定值? – hmmftg 2012-07-27 04:18:27