0

私は2つのテーブルを持っています

id   name
100    asd
101    ass
102    gdd
103    hgf
104    cvd
105    erf

テーブル b

id     filter
100     red
101     blue
100     green
100     yellow
102     black
102     red
103     dark

テーブル a はマスター テーブルであり、すべての ID がありますが、テーブル 2 は「フィルター」データを持つテーブルです。これらの 2 つのテーブルから、最小 2 つのフィルターを持たないすべての「id」を見つけたいと考えています。table-b には table-a のすべての項目番号が含まれているわけではないことに注意してください。それが table-a または table-b にあるかどうかに関係なく、すべての itemnumber が必要です。これら 2 つのテーブルを内部結合してデータを取得しようとしましたが、何も機能しませんでした。

4

3 に答える 3

2
Select A.ID, A.Name, count(*)
from tableA A
LEFT JOIN tableB B on A.ID = B.ID
Group By A.ID, A.name
having count(*) <= 1
  • LEFT JOIN は、A からのすべてのレコードと、一致する B のレコードのみを提供します。
  • ID と名前でグループ化すると、それぞれで見つかったフィルターの数をカウントできます。
  • 所有者は、カウントが 1 以下 (または最小値 2 未満) のアイテムをすべて私に与えると言っています。

    したがって、結果は次のようになります。

    101 ass 1
    103 hgf 1
    104 cvd 0 
    105 erf 0
    
于 2013-01-24T13:03:05.480 に答える
0

これはSQLServerで機能すると思います(SQLiteでテストされており、インラインビュー構文に関しては通常2つはかなり互換性があります)。ただし、構文の問題はさておき、インラインビューを使用すると、セットの操作を視覚化しやすくなります。

    select TA.id, name 
    from  TA  
    inner join
    (     

     select id from TA
     where not exists (select id from TB where TA.id = TB.id)       

     UNION         

     select id from TB
     group by id having count(filter) < 2         

    )  as FOO
   on TA.id = FOO.id

UNIONのデフォルトの動作は、重複を削除することです。

最初のUNIONセットは、フィルターを持たない(フィルターテーブルBに対応するものがない)テーブルAのIDで構成されます。

2番目のUNIONセットは、フィルターテーブルテーブルBのIDで構成され、フィルターは1つだけです。

これらの結合されたセットをテーブルAに内部結合して、エンティティ名を取得します。

于 2013-01-24T13:57:24.590 に答える
0
select
    *
from
    table-a a
    left join (
        select id, count(id) as c from table-b group by id
    ) v on a.id = v.id
where isnull(v.id, 0) < 2
于 2013-01-24T13:05:01.087 に答える