2

共通のフィールドと競合することなく、結合された 2 つのテーブルのすべてのフィールドを選択するにはどうすればよいでしょうか?

2 つのテーブルがあるProductsとしServicesます。次のようなクエリを作成したいと思います。

SELECT Products.*, Services.* 
FROM Products 
INNER JOIN Services ON Products.IdService = Services.IdService

このクエリの問題は、IdService2 回表示され、多くの問題が発生することです。

私がこれまでに見つけた別の方法は、すべてのフィールドを1 つProductsのフィールド以外から区別することIdServiceです。しかし、この方法では、新しいフィールドを に追加するたびにクエリを更新する必要がありますProducts

これを行うより良い方法はありますか?

4

8 に答える 8

13

運用コードでは決して SELECT * を使用しないでください (まあ、ほとんどありませんが、それが正当化される回数は簡単に数えることができます)。

于 2009-05-18T14:09:39.297 に答える
12

最も一般的な SQL アンチパターンは何ですか?

アンチパターン #1 にヒットしました。

より良い方法は、フィールドリストを提供することです。クイック フィールド リストを取得する 1 つの方法は、

sp_help tablename

そして、このクエリからビューを作成したい場合 - select * を使用すると、さらに問題が発生します。SQL Server は、ビューの作成時に列リストをキャプチャします。基礎となるテーブルを編集し、ビューを再作成しない場合 - トラブルにサインアップしています (私はこの性質の生産火災がありました - ビューは別のデータベースのテーブルに対してでした)。

于 2009-05-18T14:11:48.747 に答える
3

私の知る限り、避ける必要がありますがSELECT *、これは実際には問題ではありません。

SELECT *通常、あなたが利点として引用する理由から、発生するのを待っている問題と見なされます! 通常、データベースが変更されたときにクエリに対して余分な結果列が表示されると、問題が発生します。

于 2009-05-18T14:10:38.343 に答える
1

他の人が言ったように、Select * は、クエリを実行しているテーブルに他のフィールドが追加されている場合は特に悪いニュースです。テーブルから必要なフィールドを正確に選択する必要があり、同じ名前のフィールドのエイリアスを使用するか、table.columnName を使用することができます。

于 2009-05-18T14:14:04.063 に答える
1

SQL の方言は COMPOSE をサポートしていますか? COMPOSE は、あなたの例のように、等結合で使用される列の余分なコピーを取り除きます。

于 2009-05-18T14:10:25.707 に答える
1

使用禁止 *。次のようなものを使用します。

SELECT P.field1 AS 'Field from P'
     , P.field2
     , S.field1 AS 'Field from S'
     , S.field4 
  FROM Products P
       INNER JOIN 
       Services S
       ON P.IdService = S.IdService
于 2009-05-18T14:22:17.713 に答える
0

最適な方法は、クエリから必要なフィールドを正確に指定することです。とにかく使ってはいけませ*ん。

すべてのフィールドを取得するために使用すると便利ですが*、堅牢なコードは生成されません。テーブルを変更すると、クエリから返される結果が変更されますが、これは常に望ましいとは限りません。

必要な正確な順序で指定された、クエリから本当に必要なデータのみを返す必要があります。そうすれば、テーブルにフィールドを追加したり、テーブル内のフィールドの順序を変更したりしても、結果はまったく同じに見えます。

正確な出力を指定するのは少し手間がかかりますが、長い目で見れば通常は効果があります。変更を加えると、実際に変更したものだけが影響を受けます。影響を受けることさえ知らなかったコードを壊すカスケード効果は得られません。

于 2009-05-18T14:18:53.803 に答える