表basecode
表person
Intid |
Strname |
Inteducationid |
Intnationid |
1 |
張三 |
Null |
10 |
2 |
李四 |
5 |
11 |
3 |
王五 |
7 |
14 |
4 |
餘六 |
9 |
10 |
由上面兩張表得到如下的表:
編號 |
姓名 |
學歷 |
民族 |
1 |
張三 |
未知 |
漢族 |
2 |
李四 |
高中 |
藏族 |
3 |
王五 |
大專 |
回族 |
4 |
餘六 |
博士/研究生 |
漢族 |
解析:所用到的知識點:
1.連接表。有兩種方法:一是用子查詢的方法,一是用join連接。而join連接又有兩種方法:一是內連接,一是外連接(一般用左外連接比較好)
2.ISNULL函數
ISNULL函數的作用是檢查元素是否爲空,若爲空就用指定的字符串代替。
3.CASE語句
CASE 函數的組成部分:
- CASE 關鍵字。
- 需要轉換的列名稱。
- 指定搜索內容表達式的 WHEN 子句和指定要替換它們的表達式的 THEN 子句。
- END 關鍵字。
- 可選的、定義 CASE 函數別名的 AS 子句。
CASE有兩種形式:一種是根據是否相等來處理,一種是更具布爾值Boolean來處理,如實例:
下面的示例使用 CASE
函數更改產品系列類別的顯示
USE AdventureWorks;
GO
SELECT ProductNumber, Category =
CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
GO
CASE 函數的另一個用途是對數據進行分類
USE AdventureWorks; GO SELECT ProductNumber, Name, 'Price Range' = CASE WHEN ListPrice = 0 THEN 'Mfg item - not for resale' WHEN ListPrice < 50 THEN 'Under $50' WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE 'Over $1000' END FROM Production.Product ORDER BY ProductNumber ; GO
綜上所述:上題的答如下:
SELECT s.Intid AS 編號,s.Strname AS 姓名,ISNULL(b.Strcaption ,'未知')AS 學歷,ISNULL(d.Strcaption,'未知') AS 民族
FROM person AS s
LEFT OUTER JOIN basecode AS b on b.Intid=s.inteducationid
LEFT OUTER JOIN basecode AS d on d.Intid=s.intnationid
Go
SELECT s.Intid AS 編號,s.Strname AS 姓名,
'學歷'=CASE
WHEN b.Strcaption is null THEN '未知'
ELSE b.Strcaption
end,
'民族'=CASE
WHEN d.Strcaption is null THEN '未知'
ELSE d.Strcaption
end
FROM person AS s
LEFT OUTER JOIN basecode AS b on b.Intid=s.inteducationid
LEFT OUTER JOIN basecode AS d on d.Intid=s.intnationid