2012-08-23 20 views

回答

1

你不能把*放在这个子查询中。最好的办法是:

SELECT class 
    FROM Ships s 
WHERE exists 
    (
     select 1 
      from Outcomes o 
     where s.name = o.ship 
      and result = ’sunk’ 
     ) 
0

在这种情况下,您需要说明您正在选择的列。

我会建议加入,而不是

seLECT class 
FROM Ships 
    inner join outcomes 
    on ships.name=outcomes.ship 
    WHERE result = ’sunk’ 
0

您需要选择一列,因为你在你的SQL实例做了。

其还值得注意的是通配符*是坏的性能,因为服务器将需要做一些额外的工作,以制定出什么都列,因为你还没有明确规定。

如果要包括多列在IN进行比较,然后我会建议使用在你的子查询UNION

SELECT class 
    FROM Ships 
    WHERE name IN 
     (SELECT ship 
     FROM Outcomes 
     WHERE result = ’sunk’ 
     UNION 
     SELECT secondColumn 
     FROM Outcomes 
     WHERE result = ’sunk’   
     ); 
2

对于视图使用性能点这个查询

select class 
FROM Ships 
join outcomes on ships.name=outcomes.ship 
and result like 'sunk' 
+0

如果他使用的SQL服务器这可能是性能较低。在MySQL中是一样的 –

0

您正在使用In,因此您只需要一个row即可将其与名称进行比较。 在这种特殊情况下,您可以使用Join作为替代方案。 MySQL同样表现,但是in SQL-Server In is more performant than Join。 所以,你必须在这种情况下只返回一行。

如果您在inner join中使用subquery,则可以使用*,但为了便于阅读,最好返回将使用的字段。 这个例子,将是

select (fields..) 
from yourTable 
inner join (select fields from yourTable2) T2 on ConditionOfJoining 

select (fields..) 
from yourTable 
inner join (select * from yourTable2) T2 on ConditionOfJoining 
0

您应尽量避免使用*。更好的是永远不会使用*。

但在您的查询中,您必须声明该列。

+0

我阿西夫同意以下 选择类 船舶 上ships.name = outcomes.ship 加入的结果,并导致像“沉没” 但你的数据库设计,甚至可能会更好,当你有一个您的“结果”表中的外键与您的“船舶”表的ID链接,而不是使用名称。 (使用更少的存储空间并防止输入错误) SELECT class FROM Ship INNER JOIN结果ON ships.Id = outcomes.shipId and result ='sunk' – KouryouChairudo