2010-03-20 112 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  | 
+-------+--------+