Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一行中列出行的SQL查询_Sql_Ms Access - Fatal编程技术网

在一行中列出行的SQL查询

在一行中列出行的SQL查询,sql,ms-access,Sql,Ms Access,下面显示名为“奖品”的表的值 现在的问题是: 对于每个至少有三个奖项的活动,请在一行中列出活动id以及可获得的一等奖、二等奖和三等奖的奖金。按事件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

下面显示名为“奖品”的表的值

现在的问题是:

对于每个至少有三个奖项的活动,请在一行中列出活动id以及可获得的一等奖、二等奖和三等奖的奖金。按事件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;
我尝试使用自(递归)连接,但仍然显示错误

对于这个问题,SQL查询是什么样子的?

您可以试试这个

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;  
使用索引的数据约束

您可以考虑在<代码>(EnvithId,Poice)中的唯一索引,如果您已经没有了。这将防止多行使用相同的
(事件id,地点)
组合,但使用不同的
prizemoney
,这将回答问题“事件5的第一名获奖者的奖金是多少?我不知道,可能是10或100,因为有两行…”

查询性能


如果您不想让您的DBMS在子选择中读取每个
prizemoney
的DB页面,那么您可以在
(event\u id,place,prizemoney)
上有另一个唯一索引,这样DBMS就可以使用“仅索引扫描”来读取prizemoney。您需要两个索引—第一个用于约束您的需求,第二个用于
prizemoney
查找,具有索引访问而不具有表访问。三列上的第二个索引将复制表中的所有数据,可能会浪费空间。请先尝试不使用此索引。如果性能需要,请添加“所有列”索引。

提出了答案。如果正确,请将其标记为已接受。如果它对你有帮助,就投它吧。如果出现问题,请随时发表评论。仅供记录,您首先得到的错误文本是什么?您的代码已经运行,它给出了问题想要的确切结果。真的很感激:)不过我只有一个问题。您使用了p.event_id。p的作用或目的是什么。。。如果您能澄清一下,我将不胜感激:)@陌生人它为主查询的
FROM
子句中的
SELECT DISTINCT
表的虚拟结果命名
p
。你有时需要名字。例如,为了消除名称为t1和t2的同一个表t的自联接对t1.id=t2.id上的联接的歧义,请执行以下操作:。在上面的查询中,有两个
事件id
列,一方面来自名为p的子查询的虚拟表,另一方面来自
第一个
第二个
第三个
。如果答案正确,请接受。请向上投票,如果答案对你有帮助的话。接受将获得积分,2分!这很重要!换句话说,你如何区分两个相等的东西?不同事物的名称不同。如果你有两个苹果,你可以用不同的名字来区分它们。在
FROM
子句中命名了多少个表?您是否多次引用同一个表?(是,请参见奖品中的
prize p
将p作为查询外部部分的(表)查询结果的别名。如果您已将内部查询的虚拟结果表命名为
p
,则(通常)需要同时按名称和列
p引用此虚拟表的列。此处的某些列
,如
p.event\u id
@陌生人,您可能希望在适当的时候将答案标记为正确并对其进行投票。您将获得积分,通过该积分,其他人将认识到您是StackOverflow的新成员。。。不被接受的正确答案是否会对获得社区其他成员帮助的机会产生负面影响?
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;