0

次の設計でMSAccessデータベースを使用する:

Tables
Equipment, Employees, CreditCard

Fields
Equipment: ID, PrimaryEmployee, SecondaryEmployee
Employees: ID, CreditCard
CreditCard: ID, Number, Pin

したがって、1つの機器に2人の異なる従業員を割り当てることができます。各従業員には、クレジットカードを割り当てることも、まったく割り当てないこともできます。

機器のIDに基づく:

  • 機器にSecondaryEmployeeIDが設定されていて、対応する従業員にCreditCardが設定されている場合は、そのCreditCardの値を返します。
  • それ以外の場合、機器にPrimaryEmployeeIDが設定されていて、対応する従業員にCreditCardが設定されている場合は、そのCreditCardの値を返します。

また、同じクエリでEmployeesテーブルから従業員の名前を取得する必要があるため、以前はLEFT JOINを使用していましたが、これは私の知る限りでは不可能であるように思われました。

編集済み

私の現在のクエリの試み:

SELECT
    Equipment.ID,
    Equipment.PrimaryEmployee,
    Equipment.SecondaryEmployee,
    Employees.CreditCard,
    CreditCard.Pin
FROM
    (Equipment
        LEFT JOIN Employees ON Equipment.PrimaryEmployee = Employees.ID
    )
LEFT JOIN CreditCard ON Employees.CreditCard = CreditCard.ID
WHERE (((Equipment.EquipmentType)=1))

読みやすさを改善し、問題のある領域を単純化するために、クエリからいくつかの無関係なフィールドを削除しました。

これは現在、次のような結果を生成しています。

ID    PrimaryEmployee    SecondaryEmployee    CreditCard    Pin
--------------------------------------------------------------------
1     John Doe           Jack Smith           1234567890    1234
2     Bubba Smith        Ryan Howard          2345678901    2345

問題は、PrimaryEmployeeでのみ一致することです。最初にSecondaryEmployeeを確認する必要があります。一致またはクレジットカードが設定されていない場合は、PrimaryEmployeeで一致します。どちらも一致しない場合は、Nullまたは「-」を返します。

それでも追加情報が必要な場合はお知らせください。

4

2 に答える 2

1

SQLを台無しにすることなくこれを行う最も簡単な方法は、最初のクエリの結果を使用し、最初の結果が表示されるEmployee列をプルする2番目のクエリを作成することです。IS NULL.

2つのクエリを取得したら、両方のクエリの結果を1つの出力に結合する3番目のクエリを作成するだけです。

于 2012-04-17T19:52:21.663 に答える
0
LEFT JOIN Employees ON ISNULL(Equipment.SecondaryEmployee, Equipment.PrimaryEmployee) = Employees.ID

これは機能するはずですが、パフォーマンスを確認してください。左の結合は、どちらの従業員もいないものに対してnullをプルします。

于 2012-04-17T19:55:48.713 に答える