0

次の結果を得るには、SQLServerとOracle互換のクエリが必要です

テーブル:

PRIMARY IDN   SECONDARY_IDN    STATUS 
1             47               Pending
2             47               Completed
3             47               Error
4             57               Pending
5             59               Completed
6             60               Pending
7             60               Completed

私の入力は、、、またはのいずれかPendingになります。CompletedError

ステータスが1つだけのすべてのセカンダリIDNをリストする必要があり、それが入力ステータスです。

たとえば、私の入力はPending次のとおりです。57のみ表示されるはずです。他の人は持っているかもしれませんがPending、それはまた完了し、エラー記録を持っています。

手伝ってくれませんか ?

4

4 に答える 4

5
SELECT  SECONDARY_IDN
FROM    tableName
GROUP   BY SECONDARY_IDN
HAVING  SUM(CASE WHEN Status = 'Pending' THEN 1 ELSE 0 END) = COUNT(*)
于 2013-02-03T15:43:03.400 に答える
3

ステータスが1つしかないグループが必要です。そのためには、集計を使用します。

select secondary_idn
from t
group by secondary_idn
having max(status) = min(status)  and -- all the statuses are the same
       max(status) = 'Pending'        -- and the status is Pending
于 2013-02-03T15:43:26.700 に答える
1
SELECT  *
FROM  tableName tn
WHERE tn.Status = 'Pending'
AND NOT EXISTS ( SELECT *
  FROM tableName nx
  WHERE nx.SECONDARY_IDN = tn.SECONDARY_IDN
  AND nx.Status <> 'Pending'
  );

  • 外側のクエリにはがないgroup byため、すべての列を使用できます(select *この事実を説明するために恐ろしいものがあります)
  • 生成するために不要なレコードを1つだけexists検出する必要があるため、集計(最小、最大、カウント)を含むソリューションでは、レコードの望ましさを確立するためにグループ全体をスキャン(および集計)する必要があります。true
于 2013-02-03T15:52:48.087 に答える
0
 select status
 , secondary_idn
 , count(*) records
 from theTable
 where whatever
 group by status, secondary_idn
 having count(*) = 1
于 2013-02-03T15:43:39.490 に答える