2010-03-20 127 views
0

表A具有列ID和AName,表B具有列BName和ID。有關複雜SQL語句的問題

B.ID是A.ID的外鍵。

寫SQL語句來顯示像數據: 打印柱AName和C,其描述表B是否具有表A的ID,如果存在1或否則爲0。

所以,如果A爲:

1 aaa 
2 bbb 

B爲:

something,2 

輸出是:

aaa,0 
bbb,1 
+5

看起來像可能的功課問題。 – 2010-03-20 14:23:15

+4

複雜嗎?這是數據庫101,在現實生活中,你幾乎不會寫這樣簡單的查詢。 – HLGEM 2010-03-20 14:38:15

回答

4

類似以下內容將用於SQL Server工作

SELECT 
    A.AName, 
    CASE 
     WHEN B.ID IS NOT NULL THEN 1 
     ELSE 0 
    END AS C 
FROM 
    TableA A 
LEFT JOIN 
    TableB B 
ON 
A.ID = B.ID 

LEFT JOIN?這將返回包含來自表A的所有行的結果集,並且將包括來自表B的值,其中表B派生字段在SELECT子句中使用並且由JOIN條件滿足;在你的例子中,B.ID的值爲2,表A中ID爲2的行。相應地,B.ID的值爲NULL,表A中ID爲1的行。爲了將這些值分別轉換爲1或0然後,我們使用CASE語句並檢查該值是否爲null,並根據對此表達式的評估返回適當的值。

See this answer for more information on JOIN clauses

+0

在某些DBMS中,第二個值可以更簡單地寫爲ISNULL(B.ID)AS C'。 – 2010-03-20 14:27:31

+0

ISNULL將返回B.ID(如果存在)的值而不是1,這是問題的要求。 – 2010-03-20 14:36:38

2
  1. 這不是一個複雜的查詢。
  2. 準確的答案將取決於您正在使用的數據庫產品,您沒有說明。
  3. 您需要查看SQL手冊中的OUTER JOIN關鍵字以及CASE或IIF SQL函數。
2

您可能需要使用子查詢,而不是一個LEFT JOIN

測試數據(使用MySQL):

CREATE TABLE a (id int, aname varchar(100)); 
CREATE TABLE b (bname varchar(100), id int); 

INSERT INTO a VALUES ('1', 'aaa'); 
INSERT INTO a VALUES ('2', 'bbb'); 
INSERT INTO b VALUES ('something', '2'); 

查詢:

SELECT 
    a.aname, 
    CASE EXISTS(SELECT b.id FROM b WHERE b.id = a.id) 
     WHEN 1 THEN '1' 
     ELSE '0' 
    END AS output 
FROM a; 

輸出:

+-------+--------+ 
| aname | output | 
+-------+--------+ 
| aaa | 0  | 
| bbb | 1  | 
+-------+--------+