2016-07-19 15 views
0

英語の著者が書いた書籍をDESCで並べ替えることができます。私は内部結合を検索したが、私はそれが動作しないようにintに文字列を変換することはできません。どんなアイデアですか?SQLデータベースへの参加

CREATE DATABASE [Books Database] 

    CREATE TABLE [Books] 
    (
    [id] [int] IDENTITY (1,1) NOT NULL, 
    [book name] [NVARCHAR] (75), 
    [year published] [int], 
    [book prize won] [NVARCHAR] (75), 
    ) 



    INSERT INTO [Books] ([book name], [year published], [book prize won]) 
    VALUES('Amsterdam',1998, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The God of Small Things',1997, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Cost of Living',1999, NULL) 

    INSERT INTO [Books] 
    VALUES('Last Orders',1996, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Sweetshop Owner',1997,NULL) 

    INSERT INTO [Books] 
    VALUES('How Late it Was, How Late',1994 , 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('Spirit Level',1996, 'Whitbread Poetry and the Whitbread Book prizes') 

    INSERT INTO [Books] 
    VALUES('Behind the Scenes at the Museum',1995 , 'Whitbread Book prize') 

    INSERT INTO [Books] 
    VALUES('Emotionally Weird',2000, NULL) 

    INSERT INTO [Books] 
    VALUES('Human Croquet',1998, NULL) 

    INSERT INTO [Books] 
    VALUES('Felicia''s Journey' ,1994, 'Whitbread Novel and the Whitbread Book prizes') 

    INSERT INTO [Books] 
    VALUES('Every Man for Himself',1996, 'Whitbread Novel prize') 

    INSERT INTO [Books] 
    VALUES('Midnight''s Children',1980, 'Booker prize') 

    INSERT INTO [Books] 
    VALUES('The Satanic Verses',1988, 'Whitbread Novel prize') 

    INSERT INTO [Books] 
    VALUES('The Moor''s Last Sigh',1995 , 'Whitbread Novel prize') 


    INSERT INTO [Books] 
    VALUES('Larry''s Party',1998, 'Orange prize') 


    INSERT INTO [Books] 
    VALUES('Fugitive Pieces',1997 , 'Orange and the Guardian Fiction prizes') 


    INSERT INTO [Books] 
    VALUES('Reading in the Dark' ,1996 , 'Guardian Fiction prize') 


    INSERT INTO [Books] 
    VALUES('Debatable Land',1994, 'Guardian Fiction prize') 


    CREATE TABLE [Authors] 
    (
    [id] [int] IDENTITY (1,1) NOT NULL, 
    [author name] [NVARCHAR] (75), 
    [author surname] [NVARCHAR] (75), 
    [nationality] [NVARCHAR] (75), 
    [yob] [int] 
    ) 


    INSERT INTO [Authors] ([author name], [author surname],[nationality], [yob]) 
    VALUES('Ian', 'McEwan', 'English', 1948) 

    INSERT INTO [Authors] 
    VALUES('Arundhati','Roy', 'Indian', 1961) 

    INSERT INTO [Authors] 
    VALUES('Graham','Swift', 'English', 1949) 

    INSERT INTO [Authors] 
    VALUES('James','Kelman', 'Scottish', 1946) 

    INSERT INTO [Authors] 
    VALUES('Seamus','Heaney', 'Irish', 1939) 

    INSERT INTO [Authors] 
    VALUES('Kate','Atkinson', 'English', 1951) 

    INSERT INTO [Authors] 
    VALUES('William','Trevor','Irish', 1928) 

    INSERT INTO [Authors] 
    VALUES('Beryl','Bainbridge','English', 1936) 

    INSERT INTO [Authors] 
    VALUES('Salman','Rushdie','Indian', 1947) 

    INSERT INTO [Authors] 
    VALUES('Carol','Shields','American', 1950) 

    INSERT INTO [Authors] 
    VALUES('Anne','Michaels','Canadian', 1955) 

    INSERT INTO [Authors] 
    VALUES('Seamus','Deane','Irish', 1940) 

    INSERT INTO [Authors] 
    VALUES('Candia','McWilliam','Scottish', 1955) 



    /* 1) List name and surname of all authors in alphabetical order. */ 
    SELECT TOP 1000 [id] 
      ,[author name] 
      ,[author surname] 
      ,[nationality] 
      ,[yob] 
     FROM [Books Database].[dbo].[Authors] 
     ORDER BY [author name],[author surname] ASC 



     /* 2) List title of all books written by English authors in descending order of publication year. */ 


    SELECT TOP 1000 
      [author name] 
      ,[author surname] 
      ,[nationality] 
      ,[yob] 
     FROM [Books Database].[dbo].[Authors] 
     INNER JOIN [Books Database].[dbo].[Books] 
     ON [Books Database].[dbo].[Authors].[nationality] = [Books Database].[dbo].[Books].[year published] 
     ORDER BY [year published] DESC 
+0

'それは動作しません.' ...これは私たちがあなたを助けるのを簡単にしません。また、 'Book'テーブルと' Author'テーブルを関連付ける方法はありません。あなたがやっている参加は意味をなさないし、私はそれが何も見えない。 –

+0

'sql-server'タグが付いていますが、あなたの質問には' mysql'と言います。どうか明らかにしてください。 –

+0

あなたの参加は著者の国籍から出版の年になります - これは合理的な参加のようですか? – Jamiec

答えて

1

2つの問題は、次のJOINクエリであります

INNER JOIN [Books Database].[dbo].[Books] 
ON [Books Database].[dbo].[Authors].[nationality] = [Books Database].[dbo].[Books].[year published] 

問題1:

ここ[nationality]VARCHAR(75)あると[year published]INTです。異なるデータ型に一致させると、変換の問題が発生します。それは両方のテーブルから年の値に一致する意味とそのデータ型がINT

号2です

FROM [Books Database].[dbo].[Authors] AU 
INNER JOIN [Books Database].[dbo].[Books] BO ON AU.[yob] = BO.[year published] 

はまた、それらのホープ

上記の条件をに変更することができますAuthorsテーブルyobは、1928年から1961年までの範囲であり、Booksの範囲であるため、ケース内のデータは返されませんear 1980〜2000.

AUを追加しました。BOは読みやすくするためのテーブルの別名です。

+0

うん、それは何も返されない、私はそれを修正する必要がありますか? –

+0

@ TudorIoanVelcescu:両方のテーブルに有効な一致年を追加します。それ以外の場合は、[LEFT JOIN'](https://msdn.microsoft.com/en-us/library/bb208894(v=office.12).aspx)を使用して、最初のテーブルから結果を得ることができます。一致するものはありません。 – Arulkumar

0

これを行うには、書籍をその著者にリンクする方法が必要です。本は多くの著者を持ち、著者は多くの本を持つことができるので、これは通常Many-to-many relationshipのようにモデル化されます(おそらく驚くことではありませんが、M2M関係の例は書籍です)

別の表を追加する必要がありますidを予約する外部キーと、idを作成する外部キーを含む "BookAuthors"の行に沿って何かを呼び出しました。あなたは英語をしている唯一の著者によって執筆者にBookAuthorsに本やBookAuthors、フィルターに参加し、逆出版年順に結果を置くことをしたら

それは

SELECT DISTINCT 
b.[book name], 
b.[year published] 
FROM Books b 
INNER JOIN BookAuthors ba ON b.id = ba.bookId 
INNER JOIN Authors a ON ba.authorId = a.Id 
WHERE a.nationality = 'English' 
ORDER BY b.[year published] DESC 
の線に沿ってになります
+0

書籍IDへの外部キーの作成方法を教えてください。 –

+0

@ TudorIoanVelcescu(SqlServer(タグ付き)またはMySql(質問テキスト)) – Jamiec

+0

MySqlの外部キー –