0

レコードを選択するための特定のクエリを作成するのに問題があります。これは私が達成しようとしていることの唖然とした例です。

Criteria次のようなテーブルがあるとします。

ID   Unit      Product   Part
==   ========  =======   ========
1    'sports'  'bike'    'handle'
2    'sports'  ' '       ' '
3    'furn'    'couch'   ' '
etc.

Entriesそして、私はこのようなものと呼ばれるテーブルを持っています:

ID   Tuple
==   =========================
1    'sports / bike / seat'
2    'sports / racket / frame'
3    'furn / desk / leg'
4    'furn / lamp / shade'
etc.

のレコード1は、 Criteria「スポーツ/バイク/ハンドル」であるすべてのタプルが適格であることを示しています。のレコード2はCriteriaProductPartにスペースが含まれているため、「sports」で始まるタプルはすべて修飾されます( "sports /%/%")。レコード3は、「furn」および「couch」で始まるタプルが適格であることを示しています(「furn / couch /%」)。どの基準にも当てはまらないすべてのレコードを選択したいと思います。

この場合、レコード3と4Entriesは、指定された基準のいずれにも一致しないため、返される必要があります。

私はSQLを初めて使用するため、適切なクエリを思い付くのに苦労しています。私の思考プロセスはこれらの線に沿っています:

のレコードごとに、、、、およびCriteriaに基づいて文字列比較文字列を作成します。たとえば、レコード1の場合、文字列は「スポーツ/バイク/ハンドル」になります。 レコード2の場合、文字列は'sports /%/%'になり、レコード3の場合は' furn / couch /%'になります。次に、これらの文字列のいずれにも等しくないすべてのレコードを選択します。これをSQL用語に変換するのに問題があります。そこで、あなたの助けが必要です。UnitProductPartTuple

4

2 に答える 2

2

次のように使用して、外部結合でこれを行うことができます。

select e.*
from Entries e left outer join
     (select c.*,
             ((case when c.unit = ' ' then '%' else c.unit end) + ' / ' +
              (case when c.product = ' ' then '%' else c.product end) + ' / ' +
              (case when c.part = ' ' then '%' else c.part end)
             ) as likestr
      from Criteria c
     ) c
     on e.tuple like likestr
where c.id is null

これは費用のかかる操作になりますが、必要な処理を実行する必要があります。

タプルのコンポーネントを別々の列に格納した場合、データ構造はより意味があります。次に、列ごとの比較を行うことができます。

于 2012-08-30T01:22:42.777 に答える
2

なぜそのようなデータを保存しているのですか?探究心は知りたい。

ただし、これらの線に沿って何かを試すことができます。

select *
from entries e
where not exists ( select *
                   from criteria c
                   where e.tuple like           case coalesce( unit    , '' ) when '' then '%' else unit    end
                                      + ' / ' + case coalesce( product , '' ) when '' then '%' else product end
                                      + ' / ' + case coalesce( part    , '' ) when '' then '%' else part    end
                 )

醜いですが、gits'erは完了しました。

于 2012-08-30T01:30:12.200 に答える