SQL表连接 - 我做错了什么?

时间:2013-08-06 22:26:30

标签: sql sql-server join

我正在介绍数据库类,我的一个问题严重地给了我麻烦。 作业说:写一个查询来显示乘客姓名,座位号和目的地。在一个列标题Travellers_info中显示。此列应按以下格式显示数据“Mary Ann Jenkins在前往Bellmead的途中被分配到Seat 15”

这是关系视图:http://prntscr.com/1jsoay

有人可以帮帮我,我不知道我哪里出错了。

SELECT passenger.name + 'is assigned to Seat'
     + seat_info.seat_no + 'on the way to'
     + departure_info.destination AS Travellers_info
FROM passenger, seat_info, departure_info, seat_passenger, manages
WHERE passenger.Pass_id=seat_passenger.pass_id
  AND seat_passenger.Seat_id=seat_info.Seat_id
  AND seat_info.seat_id=manages.Seat_id
  AND manages.Dept_id=departure_info.dept_id

5 个答案:

答案 0 :(得分:1)

您无法使用“+”运算符“添加”文本值。

在不知道您使用的数据库的情况下,解决方案可能正在使用CONCAT()

SELECT concat(passenger.name, 'is assigned to Seat', seat_info.seat_no,
    'on the way to', departure_info.destination) AS Travellers_info
FROM passenger, seat_info, departure_info, seat_passenger, manages
WHERE passenger.Pass_id=seat_passenger.pass_id
  AND seat_passenger.Seat_id=seat_info.Seat_id
  AND seat_info.seat_id=manages.Seat_id
  AND manages.Dept_id=departure_info.dept_id

或使用||运算符:

SELECT passenger.name || 'is assigned to Seat'
     || seat_info.seat_no || 'on the way to'
     || departure_info.destination AS Travellers_info
FROM passenger, seat_info, departure_info, seat_passenger, manages
WHERE passenger.Pass_id=seat_passenger.pass_id
  AND seat_passenger.Seat_id=seat_info.Seat_id
  AND seat_info.seat_id=manages.Seat_id
  AND manages.Dept_id=departure_info.dept_id

答案 1 :(得分:1)

您是否尝试仔细检查 所有 您的表格(尤其是加入表格,例如“manage”和“seat_passenger”),以确保您的表格中包含有效数据会适当地加入吗?

另外,请确保文字中有空格。

例如:'is assigned to Seat'应为' is assigned to Seat '

答案 2 :(得分:1)

如果您没有获得数据,则必须符合您的加入条件。将您的选择减少到第一个表中的一列,然后一次加入一个表,看看何时停止获取数据

答案 3 :(得分:0)

首先,你要在之前放置一个空格,这样它就不会在一起了。

    passenger.name + ' is assigned to seat'

通常,您使用子查询和左外连接来进行此类操作。您不仅希望从所有这些表中一次性提取所有数据。让我看看我是否可以用一些SQL来解释这一点。如果您不理解我的示例,请转到此处:http://thenewboston.org/watch.php?cat=49&number=20并观看20-23,您肯定会理解它。

SELECT c.name + ' is assigned to Seat ' + c.seat_no + ' on the way to ' + departure_info.destination as Travellers_info 
FROM departure_info 
LEFT OUTER JOIN (SELECT b.Pass_id, b.name, b.seat_id, b.seat_no 
                 FROM seat_no 
                 LEFT OUTER JOIN (SELECT a.Pass_id, a.name, seat_passenger.seat_id 
                                  FROM seat_passenger 
                                  LEFT OUTER JOIN (SELECT passenger.name, passenger.Pass_id 
                                                   from passenger 
                                                   LEFT OUTER JOIN 
                                                     ON passenger.Pass_id = seat_passenger.Pass_id) a seat_info 
                                    ON a.seat_id = seat_info.seat_id) b manages 
                   ON b.seat_id = manages.seat_id) c departure_info 
  ON c.Dept_id = departure_info.Dept_id

我不相信这会给你正确答案。但是,它会让你努力寻找正确的答案。我想我在第三个子查询后犯了一个错误。请记住,SQL从内部评估事物,然后熄灭。要时刻铭记在心。希望这会有所帮助。

答案 4 :(得分:0)

在MSSQL或MSAccess中尝试此操作。

用于查询优化使用ON(加入)

SELECT passenger.name + 'is assigned to Seat '
 + ltrim(rtrim(convert(char,seat_info.seat_no))) + ' on the way to'
 + departure_info.destination AS Travellers_info
FROM passenger p
join    seat_passenger sp on sp.pass_id = p.Pass_id
join    seat_info s on s.Seat_id = sp.Seat_id
join    manages m on m.Seat_id = s.Seat_id
join    departure_info d on d.dept_id = m.dept_id

2008R2中的concat不是有效函数,因此您需要将数字数据转换为字符。 虽然在2012年可以使用。