2012-03-14 9 views
0

私は現在、次のクエリを持ってSQLを選択し、別の重複

SELECT table1.col1, table2.col2 
FROM table1  
    INNER JOIN table2 ON table1.col1=table2.col6 
WHERE col3 IN 
      (SELECT col1 
      FROM table3 
      WHERE col4 IN (
        SELECT col4 
        FROM table4 
        WHERE col5 LIKE '%XYZ%' 
       )  
      ) ORDER BY table1.col1 

私が得る結果はあなたが結果を観察した場合

COL1 | COL2 
Bob  LA 
BOB  NY 
Charlie SF 
Donald Phoenix 
Edward Chicago 
Edward DC 
Florence Miami 
George Sunnyvale 
Helen Orlando 
Helen Houston 

を次のように、ある次エントリはCol1(Bob、Edward、Helen)に複製されます。以下は単一のレコードです(Charlie、Donald、Florence、George)。

2つの異なるクエリがあります.1つのクエリで1つのレコードのみが返され、別のクエリでは重複のみが返されます。 "私は両方のクエリから返されたCol1とCol2の両方が必要です"。私は修正しようとしましたが、エラーが出るか、結果が得られません。

望ましい結果

Query1を結果(つだけ記録)

COL1 | COL2 
Charlie SF 
Donald Phoenix 
Florence Miami 
George Sunnyvale 

QUERY2結果(のみ重複したレコードが返される)Oracleと

COL1 | COL2 
Bob  LA 
BOB  NY 
Edward Chicago 
Edward DC 
Helen Orlando 
Helen Houston 
+0

ですcol3は? – Teja

+0

いくつかのサンプルデータを投稿することができますo o/p – Teja

+0

col3がテーブル1にあります – Raghu

答えて

4

また、Oracleでない場合は、GROUP BY xxx HAVING yyy = z構成に精通してください。

あなたも、あなたがすることによってグループ化されていない列を選択したいので、単にあなたのクエリにそれを追加すると、動作しませんが、ここであなたのケーキを食べて、それを持っていることの1つの簡単な方法です:

SELECT table1.col1, table2.col2 
FROM table1  
INNER JOIN table2 ON table1.col1=table2.col6 
WHERE col3 IN 
     (SELECT col1 
     FROM table3 
     WHERE col4 IN (
       SELECT col4 
       FROM table4 
       WHERE col5 LIKE '%XYZ%' 
      )  
     ) 
AND col1 IN (
    SELECT table1.col1 
    FROM table1  
     INNER JOIN table2 ON table1.col1=table2.col6 
    WHERE col3 IN 
     (SELECT col1 
     FROM table3 
     WHERE col4 IN (
       SELECT col4 
       FROM table4 
       WHERE col5 LIKE '%XYZ%' 
      )  
     ) 
    GROUP BY table1.col1 
    HAVING COUNT(table1.col1) > 1 
) 
ORDER BY table1.col1 
+0

これは良いクロスプラットフォームの解決策です:) – joshuahealy

+1

しかし、私はそこに行っているサブクエリの狂気については確信していませんでしたが、テーブルの接頭辞table1.col1が必要です。 –

+0

@Jason - あなたが正しいです。私はSQL構文を修正する答えを編集しました。最後にORDER BYを移動し、あなたが言及していない修飾子を追加しました。正直なところ私も基本的なスキーマは正確には分かりませんが、この(反)パターンは何にでも正しく作用します。 –

0

、分析関数はあなたの友達です。

SELECT 
     table1.col1, 
     table2.col2, 
     count(*) over(partition by table1.col1) AS col1count 
FROM table1  
    INNER JOIN table2 ON table1.col1=table2.col6 
WHERE col3 IN 
     (SELECT col1 
     FROM table3 
     WHERE col4 IN (
       SELECT col4 
       FROM table4 
       WHERE col5 LIKE '%XYZ%' 
      )  
     ) ORDER BY table1.col1 
    AND col1count = 1 

と重複がちょうど

 AND col1count > 1 
に最後の行を変更するための単一の結果を得るために

:あなたがあなたのデータに余分な列を持つ気にしない場合は、このような何かを行うことができます

+0

ですが、このエラーは「ORA-00923 FROMキーワードが予期した場所に見つかりません」というメッセージが表示されます。私は4行目のcol1countと最後の行が実際にcol1個のCOUNTであると仮定します。 ORA-00933 SQLコマンドが正しく終了していませんでした。私はその小さな構文の問題を想定しています。 – Raghu

+0

'AS col1count'で試してみてください - 私は – joshuahealy

+0

を編集しました。 – Raghu