0

我正在介绍数据库类,我的一个查询给我带来了严重的麻烦。作业要求:编写查询以显示乘客姓名、座位号和目的地。将其显示在一列标题 Travellers_info 中。此列应按以下格式显示数据“玛丽安詹金斯在前往贝尔米德的路上被分配到 15 号座位”</p>

这是关系视图: 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
4

5 回答 5

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
于 2013-08-06T22:33:58.420 回答
1

您是否尝试过仔细检查所有表(尤其是像“manages”和“seat_passenger”这样的连接表)以确保其中有可以适当连接的有效数据?

另外,请确保您的文本中有空格。

例如:'is assigned to Seat'应该是' is assigned to Seat '

于 2013-08-06T22:39:06.440 回答
1

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

于 2013-08-06T22:47:50.050 回答
0

在 MSSQL 或 MSAccess 中试试这个。

查询优化使用 ON (Join)

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 年它是可用的。

于 2013-08-06T23:10:25.883 回答
0

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

    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 从内部评估事物,然后退出。要时刻铭记在心。希望这可以帮助。

于 2013-08-06T22:52:43.160 回答