2016-09-23 93 views
-1
select tenant_name, tenant_dob 
from tenant 
where rental_no = (select rental_no 
        from rental 
        where apt_no = 203); 

問題是列出住在apt 203的租戶的名字和生日。上面的查詢是正確的。我的編碼如下。我知道我沒有使用子查詢語句。實際上,我只是簡單地記住學校考試問題的子查詢語句,但我想知道我什麼時候必須使用子查詢,以及爲什麼必須使用子查詢。另外,請告訴我一些我必須知道的有關子查詢才能使用的信息。SQL初學者:子查詢

select tenant_name, tenant_dob 
from tenant 
where rental_no = 203; 
+2

'rental_no '和'apt_no'不一樣。您正在使用'=',但更常用的是'in'。或者,即使是「加入」。 –

+0

當所有數據位不在同一個表中時,您需要使用子查詢(或其他方法,如連接)。 apt_no不在TENANT表中,所以您需要獲取與apt_no對應的出租號碼。注意關注Gordon所說的話:如果公寓可能有多個租賃號碼(通常有!),那麼你的查詢會給你一個運行時錯誤。如果返回一個租賃號碼,則可以使用=號;但如果有幾個租戶(幾個租戶),使用IN - 這將給你所有的租戶,而不只是一個,在apt_no = 203。 – mathguy

回答

0

就你而言,使用連接代替它會好得多。

select t.tenant_name, t.tenant_dob 
from tenant t join rental r on t.rental_no = r.rental_no 
where t.rental_no = apt_no = 203; 

你加入租戶和租賃,所以他們被視爲一個由數據庫。 接下來,您將定義您的過濾器謂詞,即apt_no = 203。 最後,您選擇要返回的屬性(t.tenant_name, t.tenant_dob)。

這是在關係數據庫中解決此任務的概念上適當的方式。

當您的過濾(where子句)很複雜時,子查詢很有用,並且使用連接表示它會弄亂您的代碼。在這種情況下,它可以簡化您的查詢,但在您的情況下,情況恰恰相反。

爲什麼我要使用子查詢?您想根據表B中的某些謂詞從表A中選擇一行。您需要A和B之間的鏈接。在子查詢中,您選擇表B中的鍵以在表A中找到適當的行。

+0

我不相信在這種特殊情況下加入是必要的。如果表格很大,那麼連接費用很高。隨着公寓數量的增加,子查詢一次檢索「租用」表格並檢索少量租用數字;那麼這些用在外部查詢中。現在,Oracle優化器確實會爲你做同樣的事情(它會將WHERE子句從外部查詢推送到各種類型的子查詢中),但從概念上講,子查詢方法似乎更自然,更有意義如果沒有優化器。 – mathguy

+0

@mathguy從概念上講,如果我們談論關係數據庫理論,那麼join就是正確的選擇。 DBMS知道我們的意圖,並且應該準備適當和優化的執行計劃。只要性能不是關鍵,我們就不會擔心發生什麼。 – Outshined

+0

如果'tenant'和'rental'之間存在一對多關係,則聯接解決方案將返回不同的結果,然後返回子查詢。 –