2016-02-05 61 views
0

我有兩張不同郵票的桌子。我們稱他們爲oristamp和tarstamp。我只需要找到相同的oristamp有不同的tarstamps的記錄。用簡單的查詢可以做到這一點?我認爲應該使用遊標,但我不熟悉這一點。任何幫助?SQL查詢或光標?

回答

1

使用一個子查詢找到oristamp具有至少兩個不同的tarstamp值的值。加入該子查詢:

select t1.* 
from tablename t1 
    join (select oristamp from tablename 
     group by oristamp 
     having count(distinct tarstamp) >= 2) t2 on t1.oristamp = t2.oristamp 
+0

謝謝你的回答@jarlh。看起來比看起來容易。始終在學習...... – PJLG

0

你可以指望不同oristamp S的每tarstamp數量和選擇具有tarstamp s的多個oristamp行,如:

SELECT * 
FROM mytable 
WHERE tarstamp IN (SELECT tarstamp 
        FROM  mytable 
        GROUP BY tarstamp 
        HAVING COUNT(DISTINCT oristamp) > 1) 
+0

你不需要相關的子查詢嗎? – jarlh

+0

@jarlh你可以這樣做,但你真的不需要 – Mureinik

+0

謝謝@Mureinik,但我需要更改'WHERE'子句以獲得期望的結果和@jarlh查詢完全相同的結果:'SELECT * FROM mytable WHERE oristamp IN(SELECT oristamp FROM mytable GROUP BY oristamp HAVING COUNT(DISTINCT tarstamp)> 1)' – PJLG

0

嘗試此查詢,這將返回所有那些含有組合不同的oristamp。

select distinct z.* from (select oristamp, count(*) ct from mytable Group by oristamp )z, (Select oristamp, tarstamp, count(*) ct from mytable Group by oristamp, tarstamp )y Where z.oristamp =y.oristamp And z.ct != y.ct

+0

僅有代碼的答案被認爲是低質量的。你能否添加一些解釋? –

2

我希望我能理解這個問題。我假設你想要每個oristamp存在多於1個不同的tarstamp值的行。

DECLARE @t table(tarstamp int, oristamp int) 
INSERT @t values 
(1,1), 
(1,1), 
(1,2), 
(2,2) 

;WITH CTE as 
(
    SELECT *, 
    max(tarstamp) over (partition by oristamp) mx, 
    min(tarstamp) over (partition by oristamp) mn 
FROM @t 
) 
SELECT * 
FROM CTE 
WHERE mx <> mn 
0

在你的情況下,使用MIN和MAX聚合函數將執行作爲COUNT(DISTINCT oristamp)>更好1增加了複雜性的執行計劃:

SELECT tarstamp 
FROM  mytable 
GROUP BY tarstamp 
HAVING MIN(oristamp) != MAX(oristamp) 
0

嘗試使用簡單連接:

DECLARE @t table(tarstamp int, oristamp int) 
INSERT @t values 
(1,1), 
(1,1), 
(1,2), 
(2,2) 


SELECT t1.* 
FROM @t t1 
INNER JOIN @t t2 
    ON t1.oristamp = t2.oristamp 
WHERE t1.tarstamp <> t2.tarstamp 
+0

請解釋如何解決問題的查詢。 – Phani

+0

@Phani此查詢返回與接受的答案相同的結果!它將返回同一oristamp具有不同tarstamps的所有記錄。這就是如何! –

+0

當然@Steve。但是如果你能描述這種不同/比別人更好的話,那將會更有意義。 – Phani