可以說,我具有SQL排除某些結果
A B
-- --
a 1
b 1
c 1
d 1
d 2
e 1
f 1
f 2
g 1
的數據組如何將我排除在第1列B中的結果,如果B列同時具有圖1和2的值在列中的相同的值一個?
我想我的結果看起來像這樣
A B
-- --
a 1
b 1
c 1
d 2
e 1
f 2
g 1
可以說,我具有SQL排除某些結果
A B
-- --
a 1
b 1
c 1
d 1
d 2
e 1
f 1
f 2
g 1
的數據組如何將我排除在第1列B中的結果,如果B列同時具有圖1和2的值在列中的相同的值一個?
我想我的結果看起來像這樣
A B
-- --
a 1
b 1
c 1
d 2
e 1
f 2
g 1
檢查明確這裏的值1和2以及使用的事實,恰好有兩個。如果可以安全地假定你總是想要最高價值,那麼你可能會使這個問題變得不那麼麻煩。
select
tbl.A,
tbl.B
from
Table1 tbl
left outer join (
select
A
from
Table1
where
B in (1,2)
group by
A
having
count(B) = 2
) mlt on tbl.A = mlt.A
where
(
mlt.A is not null
and tbl.B = 2
) or (
mlt.A is null
and tbl.B = 1
)
對於示例數據和期望的結果,最簡單的查詢來實現結果將是一個GROUP BY
操作和一個聚合函數。
SELECT d.A
, MAX(d.B) AS B
FROM my_data_set d
GROUP BY d.A
ORDER BY d.A
如果我們只在B
列有1
或2
行有興趣,我們可以添加一個WHERE
條款
SELECT d.A
, MAX(d.B) AS B
FROM my_data_set d
WHERE d.B IN (1,2)
GROUP BY d.A
ORDER BY d.A
與示例數據,輸出是一樣的。
這兩個語句都達到了指定的結果。 (目前爲A
每個不同的值只有單返回行。)
或者,相同的數據。例如,我們可以返回相同的結果具有更字面實施規範設置。
要排除1
行時存在與2
一排的A
相同的值,我們可以使用一個NOT EXISTS
謂詞和相關子查詢。
SELECT d.A
, d.B
FROM my_data_set d
WHERE (d.B = 2)
OR (d.B = 1 AND
NOT EXISTS (SELECT 1
FROM my_data_set e
WHERE e.A = d.A
AND e.B = 2
)
)
ORDER BY d.A, d.B
慣於這項工作中的數據集下方的,1個 B,1個 C,1 d,1 d,2 E,1個 F,1- 樓2 克,1層 樓3 – sumit
@sumit:正如我在答覆開始時所說的,我的建議適用於問題中給出的「*示例數據和期望結果*」。你非常正確地指出,給定一個不同的數據集,查詢的返回將會不同。 (實際上,在我的答案中,第二個查詢將返回給定註釋中提出的數據集的答案中指定的結果。)在給定不同數據集時,在問題中沒有明確指出(它含糊不清)什麼結果應該返回。 – spencer7593
select
* from tbl where a IN
(
select
a from tbl
group by a
having count(*)>1
)
and b!=1
UNION ALL
select
* from tbl where a IN
(
select
a from tbl
group by a
having count(*)=1
)
最有可能你會使用'EXISTS'。 –
是1,2固定值?我們可以有3個嗎? – sumit