0

我有 3 张桌子,每张桌子只有 2 行。T1(身份证,姓名),T2(身份证,电子邮件),T3(身份证,电话)。T1 在 id1 和 id2 上都有注册,T2 仅在 id1 上注册,在 id2 上没有在电子邮件中注册(空)。T3 在 id1 和 id2 上都有 regitrations。我想在某些条件下加入 T1、T2 和 T3(名称如 '% etc %')。结果应该是一个带有 (name, email, phone) 的表,但是如果其中一个连接表中的注册为 NULL(例如 T2 id2(email) 为 NULL),我希望结果是一个只有 (name ,电话)(T1 + T3,因为T2在id2有一个空注册)......如果列的注册不为NULL,则在多个内部连接上存在某种形式。谢谢你。

4

1 回答 1

0

我认为您需要考虑使用LEFT JOINs

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1
    LEFT JOIN T2 ON T1.id=T2.id
    LEFT JOIN T3 ON T1.id=T3.id

这将返回表 T1 中的所有记录,并且仅返回与 T2 和 T3 匹配的记录。其他字段将为 NULL。

但是,如果您只想要符合条件的那些,那么请改用 INNER JOIN:

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1
    INNER JOIN T2 ON T1.id=T2.id
    INNER JOIN T3 ON T1.id=T3.id

这只会返回匹配的记录。

如果一条记录为 NULL,您关于仅返回 2 列的评论 - 我认为这不是您想要采用的方法。返回您的所有列并在您的演示方面处理此问题。如果您真的想要动态列,那么您需要考虑使用动态 SQL。

- 编辑 -

动态 SQL 方法:

SET @id = 2;
SET @sql = NULL;

SELECT
    CONCAT(
      CASE WHEN EMail IS NOT NULL THEN 'Email' ELSE '' END,
      CASE WHEN EMail IS NOT NULL AND Phone IS NOT NULL THEN ',' ELSE '' END,
      CASE WHEN Phone IS NOT NULL THEN 'Phone' ELSE '' END)
    INTO @sql
FROM T1
    LEFT JOIN T2 ON T1.id=T2.id
    LEFT JOIN T3 ON T1.id=T3.id
WHERE T1.Id = @id;

SET @sql = CONCAT('SELECT Name, ', @sql, ' 
                   FROM T1
                      LEFT JOIN T2 ON T1.id=T2.id
                      LEFT JOIN T3 ON T1.id=T3.id
                  WHERE T1.Id = ',@id);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL 小提琴演示

于 2013-03-02T17:25:32.283 回答