SQL从两个不同的表中仅选择一条记录

时间:2019-12-13 11:03:55

标签: sql union distinct

我有两个桌子。假设它们被称为用户和msg_systems。 用户包含用户标识,名字和姓氏。 Msg_systems包含用户ID和msg_address。 Msg_address可以是电子邮件地址或手机号码。 假设我们有三个用户,唐老鸭,米老鼠和冥王星。这些表如下所示: 用户:

Userid     first_name     last_name
1          Donald         Duck
2          Mickey         Mouse
3          Pluto

消息系统:

Userid     msg_address
1          12345
1          donald.duck@duckburg.com
2          67890

我们可以看到,冥王星既没有电子邮件地址,也没有手机号码(毕竟,他只是一条狗)。米老鼠有手机号码,但没有电子邮件地址。

我现在想要达到的结果是:

Donald Duck donald.duck@duckborg.com
Mickey Mouse
Pluto

我希望列出每个用户,无论他们列出了电子邮件地址还是手机。但是,我只想要电子邮件地址,而不想要手机号码。

我尝试了一些UNION版本,但我只能设法让Donald两次,一次是使用他的电子邮件地址,一次是完全没有msgaddress的(其中,像'%@%'这样的msgaddress会跳过手机)。

4 个答案:

答案 0 :(得分:0)

要获取也不匹配的结果,则应使用左连接

select a.first_name, a.last_name, b.msg_address
from Users a
LEFT JOIN Msg_systems b on a.user_d  = b.user_id 
 AND b.msg_address LIKE U.first_name + '%'

答案 1 :(得分:0)

希望您正在使用MSSQL

LEFT JoinLIKE一起使用

SELECT ISNULL(first_name,'') + ISNULL(last_name,'') + ISNULL(msg_address,'')
FROM Users U LEFT JOIN Msg_systems MS ON U.user_d  = MS.user_id AND  MS.msg_address LIKE U.first_name + '%'

答案 2 :(得分:0)

我建议:

select u.first_name, u.last_name, ms.msg_address
from users u left join
     msg_systems ms
     on ms.user_id = u.user_id and
        ms.msg_address like '%@%;

在同一列中没有包含标识类型的列的电子邮件地址和电话号码似乎是一个非常糟糕的设计。

这会寻找'@'。显然还有其他方法可以区分这两者,但这似乎相对简单。

答案 3 :(得分:0)

请在SQL服务器查询下面尝试以下方法:

SELECT [first_name] + ' ' + [last_name] + ' ' 
       + Isnull([msg_address], '') 
FROM   [dbo].[users] 
       LEFT JOIN (SELECT * 
                  FROM   [dbo].[msg_systems] 
                  WHERE  Isnumeric([msg_address]) <> 1) f1 
              ON [users].[userid] = f1.[userid]