2012-08-23 46 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