2017-05-24 34 views
0

下图显示所谓的“大奖”SQL查询列出排在一行

PRIZE 

event_code place prizemoney 
0101  1  $120 
0101  2  $60 
0101  3  $30 
0102  1  $10 
0102  2  $5 
0103  1  $100 
0103  2  $60 
0103  3  $40 
0201  1  $10 
0201  2  $5 
0401  1  $1000 
0401  2  $500 
0401  3  $250 
0501  1  $10 
0501  2  $5 

现在的问题是表中的值:

对于至少三个奖项每一个事件,列出事项标识并在一条线上获得一等奖,二等奖和三等奖。按event_id排序表。结果将显示如下,虽然你的属性名称可能是不同的:

event_Id first second third 
101  120  60  30 

我这是怎么走近解决方案

SELECT A.event_id, B.place, C.place, D.place 
FROM PRIZE AS A, PRIZE AS B, PRIZE AS C, PRIZE AS D 
WHERE A.event_id = B.event_id 
AND A.event_id = C.event_id 
AND A.event_id = D.event_id; 

我试着用SELF(递归)加入,但仍呈现错误。

对于这个问题SQL查询将如何看起来像?

+0

提出了一个答案。如果它是正确的,请将其标记为已接受。 Upvote它,如果它帮助你。如果有问题,请随时发表评论。 – flutter

+0

只是为了记录,你第一个得到的错误文本是什么? – flutter

回答

0

可以使用索引

试试这个

SELECT p.event_id, 
     (SELECT prizemoney 
     FROM prize first 
     WHERE first.place = 1 
     AND first.event_id = p.event_id) AS "first", 
     (SELECT prizemoney 
     FROM prize second 
     WHERE second.place = 2 
     AND second.event_id = p.event_id) AS "second", 
     (SELECT prizemoney 
     FROM prize third 
     WHERE third.place = 3 
     AND third.event_id = p.event_id) AS "third", 
FROM (SELECT DISTINCT event_id FROM prize) p 
ORDER BY p.event_id; 

数据约束你可以考虑在(event_id, place)一个唯一索引,如果你没有一个了。这将防止多行具有相同的(event_id, place)组合但不同的prizemoney,这将回答quatsion“事件5的第一个赢家的奖金是什么?我不知道,可能是10或100,因为有两行。 ..“。

查询性能

如果你希望你的DBMS不上(event_id, place, prizemoney)阅读在子选择,那么你可以有另一种独特的指数每个prizemoney一个DB-页,使得DBMS可以阅读使用“索引只扫描”的奖金。您将需要两个索引 - 第一个约束您的需求,第二个索引访问prizemoney查找没有表访问。三列中的第二个索引将复制表中的所有数据,可能会浪费空间。先尝试没有此索引。如果性能要求,请添加所有列索引。

+0

你的代码已经工作,它给出了确切的结果是什么问题想要的。真的很感激:) – stranger

+0

虽然我只有一个问题。您已使用p.event_id。 p的作用或目的是什么? ...如果你能澄清它,我会非常感激:) – stranger

+0

@stranger它给主查询的'FROM'子句中'SELECT DISTINCT'表的虚拟结果赋予名字'p'。你有时需要名字。例如,为了消除名称为t1和t2的同一表t的SELF-JOIN为'JOIN ON t1.id = t2.id'。在上面的查询中,一方面来自名为p的子查询的虚拟表的“event_id”列,另一方面来自分别来自“第一”,“第二”,“第三”的子查询。如果它是正确的,请接受答案。请注意,如果答案,这个评论帮助你。你会得到积分,2!这一点很重要! – flutter