2017-11-14 12 views
-4
try { 
    Statement s = conn.createStatement(); 
    ResultSet result2 = s.executeQuery("Select Distinct * From Poem p,Recording r Where r.PoemTitle = p.PoemTitle AND r.poemTitle = 'poem1'"); 
    System.out.print("Result (Select with Join): "); 
    while (result2.next()) { 
     System.out.println(result2.getString(1)+ " " + result2.getString(2)+ result2.getString(3)); 
    } 
} catch(Exception e) { 
    System.out.print(e.getMessage()); 
} 

詩とそれが記録された日付を出力しようとしています。これが実行されると、poemtitleが出力され、記録された代わりにpoemが作成された日付が表示されます。この関係のためですか?クエリデータが出力されない外部キー

答えて

2

ほとんどの場合、SELECTリストの*が原因です。

戻したい列を返す順序で指定します。

私達はちょうど「記録日」含む列の名前を推測し、テーブル、それは中だしている:

SELECT p.PoemTitle 
    , r.dateRecorded 
    , r.readBy 
    FROM Poem p 
    JOIN Recording r 
    ON r.PoemTitle = p.PoemTitle 
WHERE r.poemTitle = 'poem1' 
GROUP 
    BY p.PoemTitle 
    , r.dateRecorded 
    , r.readBy 
ORDER 
    BY p.PoemTitle 
    , r.dateRecorded DESC 
    , r.readBy 

注:

ディッチ古い学校のコンマの構文JOINキーワードを代わりに使用し、WHERE句の結合述部をON句に再配置します。

*をSELECTリストで使用しないでください。返される列/式を明示的にリストします。コードとそのSQL文を読むと、返される列の数、列の順序、データ型の種類がわかりません。 (テーブル定義を見てください)

返されている列や式を明示的にリストするのはちょっとした作業です。コードが今までに書かれたことがあれば、それは時間がかかることなく保存されます。しかし、コードは書かれているよりも10倍多く読まれます。 (そして*とSQL文が列をgetString(1)によって参照されているかの観点では、事実上解読できないSQL文を作る。

列の列はまた、いくつかの処理でResultSetを準備するために、データベース上でそれをより効率的に行うことができますリスト列と数十の列の結果セットと、データベースからクライアントに小さな結果セットを転送します。列のサブセットでは、クエリのカバーインデックスを使用する可能性が高くなります。