【问题标题】:A question about complex SQL statement一个关于复杂SQL语句的问题
【发布时间】:2010-03-20 22:35:45
【问题描述】:

表 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

【问题讨论】:

  • 似乎是可能的家庭作业问题。
  • 复杂?这是数据库 101,在现实生活中你几乎不会写出这么简单的查询。

标签: sql


【解决方案1】:

以下内容适用于 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 的值对于表 A 中 ID 为 2 的行将是 2。同样,B.ID 值对于表 A 中 ID 为 1 的行将是 NULL。为了转换这些值分别变为 1 或 0 然后,我们使用 CASE 语句并检查值是否为空,并根据该表达式的评估返回适当的值。

See this answer for more information on JOIN clauses

【讨论】:

  • 在某些 DBMS 中,第二个值可以更简单地写为 ISNULL(B.ID) AS C
  • ISNULL 将返回 B.ID 的值(如果存在)而不是 1,这正是问题所要求的。
【解决方案2】:
  1. 这不是一个复杂的查询。
  2. 确切的答案取决于您使用的数据库产品,您没有说明。
  3. 您需要在 SQL 手册中查找 OUTER JOIN 关键字,以及 CASE 或 IIF SQL 函数。

【讨论】:

    【解决方案3】:

    您可能想要使用子查询而不是 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      | 
    +-------+--------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多