关于复杂SQL语句的问题

时间:2010-03-20 14:20:35

标签: sql

表A包含列ID和AName,表B包含列BName和ID。

B.ID是A.ID的外键。

编写一个SQL语句来显示如下数据: 打印列AName和C,描述表B中是否具有表A中的ID,如果存在1或者否则为0。

所以如果A是:

1 aaa
2 bbb

B是:

something,2

输出是:

aaa,0
bbb,1

3 个答案:

答案 0 :(得分: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条件;在您的示例中,对于表A中具有ID 2的行,B.ID的值将为2.对于表1中具有ID 1的行,C B.ID值将为NULL 。为了将这些值分别转换为1或0,我们使用CASE语句并检查该值是否为null,并根据此表达式的求值返回适当的值。

See this answer for more information on JOIN clauses

答案 1 :(得分:2)

  1. 这不是一个复杂的查询。
  2. 具体答案取决于您使用的数据库产品,您未说明这一点。
  3. 您需要在SQL手册中查找OUTER JOIN关键字,以及CASE或IIF SQL函数。

答案 2 :(得分: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      | 
+-------+--------+