2017-08-09 33 views
1

我正在處理SQL INSERT語句的VALUES部分的SELECT子句。記錄的其中一個字段是外鍵到其他記錄的外鍵。從外部表中選擇值

考慮: 表 - Ing_Fundamental

+----------------+-------------------+ 
| ID_Fundamental | ID_Title_Category | 
+----------------+-------------------+ 

表 - Title_Category

+-------------------+----------+-------------+ 
| ID_Title_Category | ID_Title | ID_Category | 
+-------------------+----------+-------------+ 

表 - 標題

+----------+-------+ 
| ID_Title | Title | 
+----------+-------+ 

表 - 分類

+-------------+----------+ 
| ID_Category | Category | 
+-------------+----------+ 

我想選擇ID_Title_Category字段,其​​中Titles.Title = "Hamburger"Categories.Category = "Meat"

我的SQL INSERT語句:

INSERT INTO Ing_Fundamental 
(
    Ing_Fundamental.ID_Title_Category 
) 
VALUES 
(
    (SELECT ????) 
) 

這裏的SQL CREATE TABLE語句Ing_Fundamental:

CREATE TABLE IF NOT EXISTS Ing_Fundamental 
(
    ID_Fundamental INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    ID_Title_Category INTEGER UNSIGNED, 
    FOREIGN KEY fk_ID_Title_Category(ID_Title_Category) 
     REFERENCES ing_title_categories(ID_Title_Category) 
     ON UPDATE CASCADE 
     ON DELETE RESTRICT, 
    UNIQUE(ID_Title_Category) 
) 

我在SELECT語句的嘗試是:

(SELECT Ing_Title_Categories.ID_Title_Category 
FROM Ing_Title_Categories 
WHERE (ID_Title_Category = 0)) 

但上面語句不會正常工作,因爲ID_Title_Category字段值爲n如果不正確,則必須通過查找TitlesCategories表中的值來確定。

那麼,根據TitlesCategories表中的字段選擇ID_Title_Category字段的SQL語法是什麼?

編輯1:背景/設計
一種基本成分具有唯一的ID。
一個基本成分有一個標題和一個類別。
類別是固定的(有限)。

用戶希望根據標題和類別在數據庫中搜索配料。

配方包含一種或多種成分(成分ID)。

我不記得我對Title_Category表的理由;它可以是標準化或減少對複合主鍵的需求。

我正在用C++編寫一個應用程序,通過SQL語句和查詢與數據庫進行交互。

在編程術語中:
Ing_Fundamental記錄包含Title_Category記錄。
Title_Category記錄包含標題記錄和類別記錄。
所有記錄都包含一個ID字段和一個或多個數據字段(如文本)。

+0

@philipxy:我在想,可能有很多成分使用一個共同的標題和類別,這就是爲什麼我把它們放在一個單獨的表。我不想複製這對。 –

+0

@philipxy:我使用術語「嵌套」,因爲我想不出適當的術語。這不是直接遏制。而不是直接參考國外的表格。 –

+0

當我問你是否需要ID_Title_Category時,我想知道是否建議你閱讀信息建模和關係數據庫的介紹。 (你的問題,如果我明白了,是基本的。)我的意思是說,如果(ID_Title,ID_Category)對是唯一的並且不是null,那麼該對可以是PK&其他FK,並且不需要ID_Title_Category。儘管無論如何,人們都會在這種情況下添加ID。 – philipxy

回答

0

我想選擇ID_Title_Category字段,其​​中Titles.Title = "Hamburger"Categories.Category = "Meat"

這沒有意義。想必你的意思是像你想要的東西select ID_Title_Category from Title_Category wherecondition。但是什麼是condition?什麼是行TitlesCategories?你不需要知道更多的SQL就可以這麼說。

你可能意味着你要select ID_Title_Category fromTitle_Category行,其中列(ID_Title)select ID_Table from Titles where Title = 'Hamburger'何行(ID_Category)select ID_Category from Categories where Category = 'Meat'

然後,它是讓你知道,SQL可以讓你寫(...) in (subselect)

select ID_Title_Category 
from Title_Category 
where (ID_Title) in (select ID_Title from Titles where Title = 'Hamburger') 
and (ID_Category) in (select ID_Category from Categories where Category = 'Meat') 

或者你可能意味着你要select ID_Title_Category fromTitle_Category行,其中存在價值爲T.ID_Title & C.ID_Category其中排T(比方說)在TitlesTC.ID_Title = T.ID_Title and T.Title = 'Hamburger'和行C(說)是CategoriesTC(說)和TC.ID_Category = C.ID_Category and C.Category = 'Meat'

然後,它是很好的知道,在SQL T cross join U是行(T.X,...,U.Y,...)其中排(T.X,...)T和行(U.Y,...)U。 (,cross join除了各種join S結合寬鬆的。)

select TC.ID_Title_Category 
from Title_Category TC 
cross join Titles T 
cross join Categories C 
where TC.ID_Title = T.ID_Title and T.Title = 'Hamburger' 
and TC.ID_Category = C.ID_Category and C.Category = 'Meat' 

此外,T cross join Ucondition可以表示爲T join U oncondition

select TC.ID_Title_Category 
from Title_Category TC 
join Titles T 
on TC.ID_Title = T.ID_Title and T.Title = 'Hamburger' 
join Categories C 
on TC.ID_Category = C.ID_Category and C.Category = 'Meat' 

你可以在subselectEXISTS(subselect)寫另一個版本知道,在SQL存在的行。

我們不需要知道查詢的約束(PK,UNIQUE,FK等)。我們確實需要每個基準錶行對於情況的說明。然後我們可以通過基表中的行來表達結果中的行。要使用關係運算符,我們需要知道如何在謂詞表達式&之間轉換關係表達式。我們還可以通過每條結果行關於情況的說明來描述結果中的行。 (這是你如何證明直覺使用in的理由。)Is there any rule of thumb to construct SQL query from a human-readable description?