デリミタを使用して複数の値を1つのフィールドに入力することはありません。これはあらゆる種類の頭痛を引き起こす。あなたはそのようなフィールドでどのように検索しますか?あなたはどのようにジョインしますか?データベースエンジンはどのようにインデックスを作成しますか?あなたは文字列処理の全体の束を行う必要があります。それは悪いニュースです。
実際の要件が何であるかに応じて、2つの解決策があります。
Secnario 1:実際の要件が「顧客は保留中の修理がすべて完了するまで呼び出されたくないと言うかもしれませんが、顧客テーブルのフィールドはブール値です。 "修理が不完全であれば電話しない"。通話のクエリは次のようになります。
select customername, whatever
from customer
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
where customer.allOrNothing=false
or not exists
(select 1 from repair ri where ri.customerid=customer.customerid and ri.completed=false)
シナリオ2:実際には、修復を任意の組み合わせで行う必要があります。すなわち、顧客は、両方が完了するまで1または3の修理のために呼びたくないと言うかもしれないし、両方が完了するまで2または5に呼ばれることを望まないが、4他に何もされていない場合、または1と3、または2と5の場合。事務員がデータを入力して管理するのは非常に複雑ですが、大丈夫です。
新しいテーブルが必要な場合は、RepairTiesという名前を付けてください。このテーブルには、RepairTieIdとRepairIdという2つの列があります。このようなネクタイを作成するたびに、「結合セット」の修復ごとに1つのレコードを作成します。セットを識別するためにRepairTieIdを作成します。 RepairTieIdの価値は、それ自身の何も意味しません。修復記録をまとめて結ぶだけのものです。もしそうなら、「アンカーポイント」。個々の修復記録に依存しないものにすべての修復記録を添付できるように、これが必要です。 (#1を修復するために#2修復を結びつけたくないということに注意してください。修復が3つあるなら、#2と#3を#1に結びつけます。 #2と#3が結びついています...#1と#2が結ばれているという事実を失いたくはありません。
はその後、クエリは次のようになります。
select customername, whatever
from customer
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
where not exists
(select 1 from repairtie t1
join repairtie t2 on t1.repairtieid=t2.repairtieid and t2.completed=false
where t1.repairid=rc.repairid)
通常の免責事項:私はこれのいずれかをテストしていませんが、それは私の頭の上からすべてですので、細部に誤りがあるかもしれませんが、原理は動作するはずです。
出典
2011-07-14 21:44:19
Jay
ありがとうございました。私は1つの列に複数の値を入れることはノーであることを知っています。同僚がこれを行い、私はいつもそのアイデアを嫌っていました。テーブル/コラムを扱うとき頭痛を与えます。ありがとう! – Jeff