2017-06-28 10 views
1

FROMなしこれは、テーブルの構造SQL:副問合せを句

CREATE TABLE Book_Tag (id INT, Book_Id INT, tag varchar(20)) 

CREATE TABLE Book_Master (Book_Id INT, Book_title VARCHAR(50), price INT) 

され、データが次のようになります。

INSERT INTO Book_Master 
SELECT 1, 'Good Profit', 28 UNION ALL 
SELECT 2, 'The Secret', 20 UNION ALL 
SELECT 3, 'The One Minute Manager', 9 UNION ALL 
SELECT 4, 'The 7 Habits of Highly Effective People', 35 UNION ALL 
SELECT null, 'Who Moved My Cheese?', 15 UNION ALL 
SELECT null, 'Blink: The Power of Thinking Without Thinking', 40 

INSERT INTO Book_Tag 
SELECT 1, 1, 'Management' UNION ALL 
SELECT 2, 1, 'Profit' UNION ALL 
SELECT 3, 2, 'Mind' UNION ALL 
SELECT 4, 3, 'Management' UNION ALL 
SELECT 5, 3, 'Efficiency' UNION ALL 
SELECT 6, 3, 'Success' UNION ALL 
SELECT 7, 4, 'Success' UNION ALL 
SELECT 8, null, 'Time' UNION ALL 
SELECT 9, 6, 'SelfHelp' UNION ALL 
SELECT 10, 6, 'Motivation' UNION ALL 
SELECT 11, 8, 'Mind' 

select * from Book_Master

Book_Id Book_title          price 
1   Good Profit          28 
2   The Secret          20 
3   The One Minute Manager       9 
4   The 7 Habits of Highly Effective People   35 
NULL  Who Moved My Cheese?       15 
NULL  Blink: The Power of Thinking Without Thinking 40 

select * from Book_Tag

id Book_Id tag 
1 1  Management 
2 1  Profit 
3 2  Mind 
4 3  Management 
5 3  Efficiency 
6 3  Success 
7 4  Success 
8 NULL Time 
9 6  SelfHelp 
10 6  Motivation 
11 8  Mind 

私は次の理由がわかりませんし、その理由もわかりません。

select BT.* from Book_Tag BT 
where BT.Book_Id in (select id) 

id Book_Id tag 
1 1  Management 

またはこれは

select BT.* from Book_Tag BT 
where BT.Book_Id not in (select id) 

id Book_Id tag 
2 1  Profit 
3 2  Mind 
4 3  Management 
5 3  Efficiency 
6 3  Success 
7 4  Success 
9 6  SelfHelp 
10 6  Motivation 
11 8  Mind 

答えて

0

あなたの最初のクエリ:

select BT.* 
from Book_Tag BT 
where BT.Book_Id in (select id); 

それは同じです:NULLが等しくないことに注意してくださいあなたは

1 1 Management

を取得する理由であること

select BT.* 
from Book_Tag BT 
where BT.Book_Id = BT.id; 

NULLまたはそれ以外のもの

あなたが持っている2番目の例では

:なし 8 NULL Time行が存在しないこと

select BT.* 
from Book_Tag BT 
where BT.Book_Id <> BT.id; 

注:

select BT.* 
from Book_Tag BT 
where BT.Book_Id not in (select id); 

と同じです。

EDIT:

しかし、サブクエリはずのでは、idが来て、そこからテーブルを指定します。 MSDNから

一般的なルールは、ステートメントの列名は、暗黙的に同じレベルのFROM句で参照されるテーブルによって修飾されていることです。 サブクエリのFROM句で参照されるテーブルにカラムが存在しない場合は、外部クエリのFROM句で参照されるテーブルによって暗黙的に修飾されます。

カラムは、サブクエリのFROM句で参照されるテーブルに存在するが、外側のクエリのFROM句で参照されるテーブルに存在しないサブクエリで参照される場合、クエリはエラーなしで実行されます。 SQL Serverは、外部クエリのテーブル名を使用してサブクエリの列を暗黙的に修飾します。

+0

クエリが実際にどのように解釈されるかを分かりやすくありがとう。 しかし、副問合せでは、IDが来るテーブルを指定するべきではありません。選択肢1を選択しないか、または「クエリ」を選択しない限り、選択肢が表示されないことを意味します。 –

+0

@DurveshPatil編集内容を参照してください – lad2025

+0

ご清聴ありがとうございます。多くの助けになります。 –

0

あなたがここに求めている "BT.Book_Idは(IDを選択)でどこ"、どこBook_ID = IDを言っています。したがって、この場合は、それが出力されます。 Book_IDとIDは両方とも1です。そうでない場合、それらが等しくない場合、それはそのテーブルの他のすべてです。

+0

クエリが基本的にBook_ID = IDのように機能することを躊躇してくれてありがとう。 しかし、副問合せでは、IDが来るテーブルを指定するべきではありません。私は、Select 1を実行したり、「Query」を選択しない限り、fromを使わないでselectを参照するのは一般的ではないことを意味します。 –

関連する問題