2016-12-07 6 views
1

Voici mes déclarations de création:Pourquoi cette requête SQL renvoie-t-elle le nom d'auteur d'un article comme NULL, si l'auteur a écrit plusieurs articles?

  String createFeedTable = "CREATE TABLE rss_feed (" 
       + "channel_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), " 
       + "channelTitle VARCHAR(255), " 
       + "channelLink VARCHAR(255), " 
       + "channelDescription VARCHAR(255), " 
       + "channelPubDate TIMESTAMP, " 
       + "channelLastBuildDate TIMESTAMP," 
       + "channelIcon BLOB(1M)," 
       + "PRIMARY KEY (channel_ID))"; 

     String createFeedItemTable = "CREATE TABLE feed_item (" 
       + " item_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," 
       + " itemTitle VARCHAR(255)," 
       + " itemLink VARCHAR(255)," 
       + " itemDescription VARCHAR(255)," 
       + " itemGuid VARCHAR(255)," 
       + " itemPubDate TIMESTAMP," 
       + " channel_ID INTEGER REFERENCES rss_feed(channel_ID)," 
       + " haveRead BOOLEAN DEFAULT FALSE," 
       + " PRIMARY KEY (item_ID))"; 

     String createCategoryTable = "CREATE TABLE category (" 
       + "category_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," 
       + "categoryName VARCHAR(255), " 
       + "CONSTRAINT category_constraint UNIQUE (categoryName)," 
       + "PRIMARY KEY (category_ID))"; 

     String createFeedItemCategoryTable = "CREATE TABLE feed_item_category (" 
       + " item_ID INTEGER REFERENCES feed_item(item_ID)," 
       + " category_ID INTEGER REFERENCES category(category_ID))"; 

     String createFeedCategoryTable = "CREATE TABLE rss_feed_category (" 
       + "feed_ID INTEGER REFERENCES rss_feed(channel_ID)," 
       + "category_ID INTEGER REFERENCES category(category_ID))"; 

     String createAuthorTable = "CREATE TABLE author (" 
       + "author_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)," 
       + "authorName VARCHAR(255)," 
       + "CONSTRAINT author_constraint UNIQUE (authorName)," 
       + "PRIMARY KEY (author_ID))"; 

     String createFeedItemAuthorTable = "CREATE TABLE feed_item_author (" 
       + "item_ID INTEGER REFERENCES feed_item(item_ID)," 
       + "author_ID INTEGER REFERENCES author(author_ID))"; 

Ma requête:

SELECT i.ITEMTITLE, i.ITEMLINK, i.ITEMDESCRIPTION, i.ITEMPUBDATE, i.CHANNEL_ID, 
    i.ITEM_ID, a.AUTHOR_ID, a.AUTHORNAME 

    FROM FEED_ITEM i 
    LEFT JOIN FEED_ITEM_AUTHOR fia 
     ON i.ITEM_ID = fia.ITEM_ID 
    LEFT JOIN AUTHOR a 
     ON fia.ITEM_ID = a.AUTHOR_ID; 

Le résultat:

<table border =1> 
 
<tr> 
 
<th>ITEMTITLE</th> 
 
<th>ITEM_ID</th> 
 
<th>AUTHOR_ID</th> 
 
<th>AUTHORNAME</th> 
 
</tr> 
 
<tr> 
 
<td align="center">Lawyers...</td> 
 
<td align="center">1</td> 
 
<td align="center">1</td> 
 
<td align="center">Joe Mullin</td> 
 
</tr> 
 
<tr> 
 
<td align="center">AT&T/Time Warner...</td> 
 
<td align="center">2</td> 
 
<td align="center">2</td> 
 
<td align="center">Jon Brodkin</td> 
 
</tr> 
 
<tr> 
 
<td align="center">The “technosphere” ...</td> 
 
<td align="center">19</td> 
 
<td align="center">19</td> 
 
<td align="center">Annalee Newitz</td> 
 
</tr> 
 
    <tr> 
 
<td align="center">Decrypted: ...</td> 
 
<td align="center">20</td> 
 
<td align="center">&lt;null&gt;</td> 
 
<td align="center">&lt;null&gt;</td> 
 
</tr> 
 

 

 
</table>

Le tableau, feed_item_author, a le nombre correct d'auteurs et d'articles - 15 auteurs et 20 articles et correspond à la ligne de données correctement pour la ligne.

Les tables, auteur et feed_items ont aussi le nombre correct de lignes - 15 auteurs et 20 feed_items.

J'ai aussi dans mon code pour vérifier que tout a été correctement saisi:

try { 

     feedItem_AuthorStatement = conn.prepareStatement(feed_item_author_SQL, PreparedStatement.RETURN_GENERATED_KEYS); 

     feedItem_AuthorStatement.setInt(1, item_ID); 
     feedItem_AuthorStatement.setInt(2, author_ID); 
     int entrySuccess = feedItem_AuthorStatement.executeUpdate(); 

     System.out.println("SUCCESS? :" + entrySuccess); 
    } catch (SQLException ex) { 
     Logger.getLogger(FeedItemCategoryHelper.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Qu'est-ce que je manque ici? Pourquoi ma requête renvoie null pour le nom et l'identifiant de l'auteur, si l'auteur a écrit plus d'un article?

Répondre

2

Ne devriez-vous pas vous joindre à ON fia.AUTHOR_ID = a.AUTHOR_ID;

Vous souhaitez que les identifiants de l'auteur soient les mêmes. À moins que je ne manque quelque chose, cela n'a aucun sens de vouloir qu'un itemID corresponde à un auteur.

+0

Bingo. Merci, Learning2Code. – user465001