SQL謂詞 FOR SOME
确定是否根據字段值的條件測試傳回記錄。
大綱
FOR SOME (table [AS t-alias]) (fieldcondition)
複制
參數
-
-table
Table
可以是單個表,也可以是用逗号分隔的表清單。
括号是必須的。
-
AS t-alias
- 可選-前一個表名的别名。
别名必須是有效的辨別符;
它可以是一個分隔符。
-
-fieldcondition
fieldcondition
指定一個或多個引用一個或多個字段的條件表達式。
字段條件用括号括起來。
可以使用
和AND(&)
邏輯操作符在字段條件中指定多個條件表達式。OR(!)
描述
FOR SOME
謂詞允許根據表中一個或多個字段值的布爾條件測試來決定是否傳回記錄。
如果
fieldcondition
計算結果為
true
,則傳回記錄。
如果
fieldcondition
計算結果為
false
,則不傳回記錄。
對于表(及其可選的
t-alias
)參數,必須使用括号分隔。
分隔括号對于字段條件參數也是強制性的。
允許(但不是必需的)在這兩組括号之間使用空格。
通常,
FOR SOME
用于确定是否根據另一個表中一條記錄的内容從一個表傳回一條記錄。
FOR SOME
還可用于确定是否根據同一表中記錄的内容從表中傳回記錄。
在後一種情況下,要麼傳回所有記錄,要麼不傳回任何記錄。
在下面的示例中,
For Some
傳回
Sample.Person
表中其
Name
字段值與
Sample.Employee
表中的
Name
字段值比對的所有記錄:
SELECT Name,COUNT(Name) AS NameCount
FROM Sample.Person AS p
WHERE FOR SOME (Sample.Employee AS e)(e.Name=p.Name)
ORDER BY Name
複制
在下面的示例中,
FOR
根據同一表的布爾測試傳回
Sample.Person
表中的某些記錄。如果至少有一條記錄的年齡值大于
65
,此程式将傳回所有
Sample.Person
記錄。否則,它不傳回任何記錄。由于
Sample.Person
中至少有一條記錄的年齡字段值大于65,是以将傳回所有
Sample.Person
記錄:
SELECT Name,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Person)(Age>65)
ORDER BY Age
複制
與大多數謂詞一樣,可以使用NOT邏輯運算符對某些謂詞進行倒置,如下例所示:
SELECT Name,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE NOT FOR SOME (Sample.Person)(Age>65)
ORDER BY Age
複制
複合條件
一個字段條件可以包含多個條件表達式。這組條件包含在圓括号中。使用邏輯運算符
AND
和
OR
指定多個條件,這些條件也可以使用
SELECT Name,COUNT(Name) AS NameCount
FROM Sample.Person AS p
WHERE FOR SOME (Sample.Employee AS e)(e.Name=p.Name AND p.Name %STARTSWITH 'A')
ORDER BY Name
複制
SELECT Name,COUNT(Name) AS NameCount
FROM Sample.Person AS p
WHERE FOR SOME (Sample.Employee AS e)(e.Name=p.Name OR p.Name %STARTSWITH 'A')
ORDER BY Name
複制
在以下示例中,對于某些記錄,傳回
Sample.Person
表中其
Name
字段值與
Sample.Employee
表中的
Name
字段值比對,并且其住所(
Home_State
)與其辦公室(
Office_State
)處于相同狀态的所有記錄:
SELECT Name,Home_State,COUNT(Name) AS NameCount
FROM Sample.Person AS p
WHERE FOR SOME (Sample.Employee AS e)(p.Name=e.Name AND p.Home_State=e.Office_State)
ORDER BY Name
複制
多個表
可以在字段條件之前以逗号分隔的清單形式指定多個表。
确定是否傳回記錄的條件可以引用從中選擇資料的表,也可以引用另一個表中的字段值。
表别名通常需要将每個指定的字段與其表關聯起來。
在下面的示例中,如果
Sample.Person
表中至少有一個名稱也在
Sample.Employee
表中,則傳回所有記錄。由于至少有一條記錄滿足此條件,是以将傳回所有
Sample.Person
記錄:
SELECT Name AS PersonName,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Employee AS e,Sample.Person AS p) (e.Name=p.Name)
ORDER BY Name
複制
在下面的示例中,如果
Sample.Person
表中至少有一個名稱也在
Sample.Company
表中找到,則傳回所有記錄。由于人名和公司名(在此資料集中)從不相同,是以此條件不适用于任何記錄。是以,不傳回
Sample.Person
記錄:
SELECT Name AS PersonName,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Company AS c,Sample.Person AS p) (c.Name=p.Name)
ORDER BY Name
複制