我有一項任務,其中我使用 Northwind 資料庫僅選擇類別名稱以“C”開頭的這些產品。產品詳細資訊在產品表中,而類別名稱在類別表中,這是我想出的唯一答案
SELECT P.*
FROM Products P, Categories C
WHERE C.CategoryName LIKE 'C%' AND P.CategoryID = C.CategoryID
我很好奇是否可以在不將 Categories 放入 FROM 子句并連接表的情況下做到這一點。對我來說,我可以訪問子表并使用其中的值似乎是合乎邏輯的,你能解釋一下為什么不可能嗎?
uj5u.com熱心網友回復:
您可以使用相關子查詢來實作此目的:
SELECT *
FROM Products p
WHERE EXISTS (SELECT id FROM Categories c WHERE c.id = p.id)
這個子查詢是“相關的”,因為子查詢中的 SQL 參考了它所在的查詢。非常類似于連接,但我們在 WHERE 子句中使用了EXISTS條件。
EXISTS很好,因為它不關心子查詢回傳什么。它只關心子查詢回傳了 ANYTHING。所以該子查詢也可以是:SELECT 1 FROM Categories WHERE c.id = p.id并且這個查詢仍然有效。
uj5u.com熱心網友回復:
您應該使用 JOINS 而不是那種型別的語法 (INNER, LEFT, RIGHT, ...) 但是您可以這樣做
SELECT P.*
FROM dbo.Products P WITH (NOLOCK)
INNER JOIN dbo.Categories C WITH (NOLOCK)
ON P.CategoryID = C.CategoryID
WHERE
SUBSTRING(LTRIM(C.CategoryName), 1, 1) = 'C'
使用 INNER JOIN 將產品與類別連接起來,它只會回傳匹配的記錄。WITH (NOLOCK)在從事務資料庫中進行選擇時添加,以便在嘗試運行事務時不會鎖定用戶。我盡量避免LIKE,所以在你的場景中你可以使用子字串來獲取第一個字符。第一個引數是運算式,然后是起始索引,然后是需要抓取的字符數。LTRIM將從左側洗掉空格,因此即使您的 CategoryName 不小心有一個或多個前導空格,它也會在運行子字串之前洗掉它們。RTRIM 對于您的需要是不必要的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381069.html
標籤:sql sql-server 查询语句
