我的数据库中有这些表:
游客 - 这是第一张表
Tourist_ID - primary key
name...etc...
Extra_charges
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
我提出了一个查询,因此我可以将游客的名字和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
);
所以问题是,如果游客有所有额外费用 - 我的查询将不返回任何行。 但无论是否有额外费用,我都需要旅游者的名字。但在我的情况下,我不能使用左连接而不是交叉
答案 0 :(得分:0)
由于您应用的两个条件在逻辑上是不同的,因此您需要使用两个查询来获取它。第一个是和以前一样,游客没有额外收费,第二个是收取所有额外费用的游客
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);
<强> Example on SQL Fiddle 强>