带内连接的Sql子查询

时间:2013-07-24 07:54:05

标签: sql

我的数据库中有这些表:

游客 - 这是第一张表

    Tourist_ID - primary key
Extra_Charge_ID - foreign key

name...etc...

EXTRA_CHARGES

    Extra_Charge_ID - primmary key 
   Excursion_ID - foreign key

    Extra_Charge_Description

Tourist_Extra_Charges

Tourist_Extra_charge_ID

Extra_Charge_ID - foreign key

Tourist_ID - foreign key

预订

Reservation_ID - primary key

.....

Tourist_Reservations

Tourist_Reservation_ID

Reservation_ID - foreign key

Tourist_ID - foreign key

所以这是我的例子:我已经预约Reservaton_ID - 27 这项预订有两位游客Tourist_ID - 86和Tourist_ID - 87这位名为86的游客在Extra_Charge_ID - 7和Extra_charge_ID - 11;

是否可以进行sql查询以及游客的名称和id然后全部 额外费用

所以输出可能如下所示:

Tourist_ID : 86  Name:John   Extra_Charge_ID - 7 Extra_Charge_ID - 11


Tourist_ID: 87  Name:Erika 

Extra-Charge_ID:10

(这是我为了获得所有预订_ID = 27的游客的extra_charge_description所做的查询,但我不知道如何更改它。获取上面的名字)

Select EXTRA_CHARGES.Extra_Charge_Description,TOURIST_EXTRA_CHARGES.Tourist_ID FROM EXTRA_CHARGES

         INNER JOIN TOURIST_EXTRA_CHARGES on EXTRA_CHARGES.Extra_Charge_ID = TOURIST_EXTRA_CHARGES.Extra_Charge_ID

 INNER JOIN TOURIST_RESERVATION on TOURIST_EXTRA_CHARGES.Tourist_ID = TOURIST_RESERVATION.Tourist_ID
          INNER JOIN  RESERVATIONS on RESERVATIONS.Reservation_ID = TOURIST_RESERVATION.Reservation_ID
          where RESERVATIONS.Reservation_ID=27

3 个答案:

答案 0 :(得分:2)

您的数据库架构并不完全清楚,但似乎您可以通过旅游表中的游客与 EXTRA_CHARGES 表中的额外费用相关联> Tourist_Extra_Charges 这样的表:

SELECT  T.Tourist_ID
        ,T.Tourist_Name
        ,EC.Extra_Charge_ID
        ,EC.Extra_Charge_Description
FROM    Tourist AS T
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID;

修改

如果您希望能够对 Reservation_ID 进行过滤,则您必须同时加入 Tourist_Reservations 预订表格,像这样:

SELECT  T.Tourist_ID
        ,T.Tourist_Name
        ,EC.Extra_Charge_ID
        ,EC.Extra_Charge_Description
FROM    Tourist AS T
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID
INNER JOIN Tourist_Reservations AS TR ON T.Tourist_ID = TR.Tourist_ID
INNER JOIN Reservations AS R ON TR.Reservation_ID = R.Reservation_ID
WHERE   R.Reservation_ID = 27;

关于您的数据库架构:请注意旅游表中不需要 Extra_Charge_ID 字段:您已经通过 Tourist_Extra_Charges将游客与额外费用相关联表。对于数据的健全性来说,建立这种双重连接可能是危险的。

答案 1 :(得分:1)

您可以将其与GROUP_CONCAT分隔在列表中,例如:

SELECT Tourist_ID, Name, GROUP_CONCAT(Extra_Charge_ID SEPARATOR ',') 
FROM Tourist
GROUP BY Tourist_ID

答案 2 :(得分:0)

你写道:

  

“这名身份为86的游客额外收取Extra_Charge_ID - 7和Extra_charge_ID - 11;”

但是您的Tourist表确实将Tourist_ID作为主键,因此您将无法使用两个不同的Extra_Charge_ID插入旅游者86.

解决方案是从Tourist表中删除Extra_Charge_ID。

你已经有了Tourist_Extra_Charges,为什么不使用它?

Tourist
-------
86
87

Tourist_Extra_Charges
---------------
1,7,86
2,11,86