0

このSQLクエリについて質問があります。

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

サブクエリに書き込むことはできますか、それともSELECT * From Outcomes常に行う必要がselectありrowますか?

そして、どのクエリが最高のパフォーマンスを発揮しますか?

4

6 に答える 6

2

パフォーマンスの観点から、このクエリを使用してください

 select class 
 FROM Ships 
 join outcomes on ships.name=outcomes.ship
 and result like 'sunk'
于 2012-08-23T12:23:44.010 に答える
1

このサブクエリに*を入れることはできません。それを行うための最良の方法は次のとおりです。

SELECT class
  FROM Ships s
 WHERE exists
     (
        select 1 
          from Outcomes o
        where s.name = o.ship
          and result = ’sunk’
       )
于 2012-08-23T12:25:37.430 に答える
0

この場合、選択している列を指定する必要があります。

代わりに参加することをお勧めします

 seLECT class 
 FROM Ships 
     inner join outcomes
     on ships.name=outcomes.ship
    WHERE result = ’sunk’
于 2012-08-23T12:21:47.713 に答える
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’        
        );
于 2012-08-23T12:23:33.967 に答える
0

を使用しているので、名前と比較するInために必要なのは1つだけです。rowこの特定のケースでは、代わりに結合を使用できます。InMySQLは同等のパフォーマンスを発揮しますが、SQL-ServerではJoinよりもパフォーマンスが高くなります。したがって、この場合は1行だけを返す必要があります。

でを使用する場合はsubqueryinner joinを使用できます*が、読みやすくするために、使用するフィールドを返す方が適切です。この例は、

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
于 2012-08-23T12:24:22.103 に答える
0

*の使用は常に避けてください。さらに良いのは、*を使用しないことです。

ただし、クエリでは列を指定する必要があります。

于 2012-08-23T12:25:07.507 に答える