2

このフォーラムは初めてで、SQL も初めてです。一部のデータをクリーンアップしてエラーを取り除こうとしています。2 つのテーブルがあり、どちらも列 FILENAME、TYPE、SEC を共有しています。SEC と TYPE の間に 1 対多の関係がある両方のテーブルから任意のレコードを引き出したいと思います。 1 つの関係は無視でき、有効と見なされます。

たとえば、私はtable1にあります。

FILENAME TYPE SEC

a----------------x----1

b----------------x----2

c----------------y----1

d----------------y----3

table2 では、似たようなものがありますが、

FILENAME TYPE SEC

e----------------x----1 

f----------------x----2

g----------------z----1

h----------------y----3

だから私は見つけるクエリが欲しい

FILENAME TYPE SEC

a----------------x----1

c----------------y----1

e----------------x----1

g----------------z----1

私のデータベースは非常に大きく、どんな助けでも大歓迎です!

ありがとう。

4

3 に答える 3

1
select t1.sec, t1.type, count(*) from table1 as t1 
join table2 as t2 on t1.sec = t2.sec and t1.type = t2.type
group by t1.sec, t1.type
having count(*) > 1

編集:それはあなたが尋ねたものではありません.複数のレコードがあるものを示しますが、それらはグループ化されます.

于 2012-09-30T23:12:19.010 に答える
0

sec複数の を持つ の値を見つける必要がありますtype。次のクエリはこれを行い、どのデータベースでも機能するはずです。

select t.*
from ((select t1.*
       from t1
      ) union all
      (select t2.*
       from t2
      )
     ) t join
     (select sec
      from ((select t1.*
             from t1
            ) union all
            (select t2.*
             from t2
            )
           ) t
      group by sec
      having count(distinct type) > 1
     ) s
     on t.sec = s.sec

データベースによっては、クエリを実行するためのより効率的な方法がある場合があります。

于 2012-09-30T23:13:05.273 に答える
0
select 'table1' which, t.*
from (
    select sec, min(type) typea, max(type) typeb
    from table1
    group by sec
    having min(type) <> max(type)
) x
join table1 t on t.sec = x.sec
UNION ALL
select 'table2', t.*
from (
    select sec, min(type) typea, max(type) typeb
    from table1
    group by sec
    having min(type) <> max(type)
) x
join table2 t on t.sec = x.sec

2 番目のものは最初のものを複製し、UNION ALL を使用して結合します

于 2012-09-30T23:13:32.223 に答える