0

データベースに次のテーブルがあります。

ツーリスト- これが最初のテーブルです

 Tourist_ID - primary key
    name...etc...

追加料金

Extra_Charge_ID - primary key 
Extra_Charge_Description
Amount

Tourist_Extra_Charges

Tourist_Extra_Charge_ID


    Extra_Charge_ID - foreign key
        Tourist_ID - foreign key

Tourist の名前と、この Tourist に属さないEXTRA_CHARGES テーブルのすべての料金を取得できるように、クエリを作成しました。

SELECT  Tourist.Name,
        EXTRA_CHARGES.Extra_Charge_Description,
        EXTRA_CHARGES.Amount 
FROM    Tourist
        CROSS JOIN EXTRA_CHARGES
WHERE   Tourist.Tourist_ID= 86 
AND     NOT EXISTS
        (   SELECT  1
            FROM    TOURIST_EXTRA_CHARGES
            WHERE   TOURIST_EXTRA_CHARGES.Tourist_ID = Tourist.Tourist_ID
            AND     TOURIST_EXTRA_CHARGES.Extra_Charge_ID = EXTRA_CHARGES.Extra_Charge_ID
        );

したがって、問題は、観光客がすべての extra_charges を持っている場合、クエリで行が返されないことです。しかし、extra_charges の有無に関係なく、旅行者の名前が必要です。しかし、私の場合、クロスの代わりに左結合を使用できません

4

1 に答える 1

0

適用する 2 つの条件は論理的に異なるため、2 つのクエリを使用して取得する必要があります。1つ目は以前と同様、観光客には追加料金がかからない追加料金で、2つ目はすべての追加料金がかかる観光客向けです

SELECT  Tourist.Name,
        EXTRA_CHARGES.Extra_Charge_Description,
        EXTRA_CHARGES.Amount 
FROM    Tourist
        CROSS JOIN EXTRA_CHARGES
        LEFT JOIN TOURIST_EXTRA_CHARGES
            ON TOURIST_EXTRA_CHARGES.Tourist_ID = Tourist.Tourist_ID
            AND TOURIST_EXTRA_CHARGES.Extra_Charge_ID = EXTRA_CHARGES.Extra_Charge_ID
WHERE   Tourist.Tourist_ID = 1 
AND     TOURIST_EXTRA_CHARGES.Tourist_Extra_Charge_ID IS NULL
UNION ALL
SELECT  Tourist.Name,
        NULL,
        NULL
FROM    Tourist
        CROSS JOIN EXTRA_CHARGES
        LEFT JOIN TOURIST_EXTRA_CHARGES
            ON TOURIST_EXTRA_CHARGES.Tourist_ID = Tourist.Tourist_ID
            AND TOURIST_EXTRA_CHARGES.Extra_Charge_ID = EXTRA_CHARGES.Extra_Charge_ID
WHERE   Tourist.Tourist_ID = 1 
GROUP BY Tourist.Name
HAVING COUNT(*) = COUNT(TOURIST_EXTRA_CHARGES.Tourist_Extra_Charge_ID);

SQL Fiddle の例

于 2013-10-14T08:50:46.010 に答える