SQL仅从两个不同的表中选择一条记录
我有两张桌子。假设他们被称为用户和味精系统。 用户包含用户ID、名字和姓氏。 Msg_系统包含用户ID和Msg_地址。Msg_地址可以是电子邮件地址或手机号码。 假设我们有三个用户,唐老鸭、米老鼠和布鲁托。这些表如下所示: 用户: Msg_系统:SQL仅从两个不同的表中选择一条记录,sql,union,distinct,Sql,Union,Distinct,我有两张桌子。假设他们被称为用户和味精系统。 用户包含用户ID、名字和姓氏。 Msg_系统包含用户ID和Msg_地址。Msg_地址可以是电子邮件地址或手机号码。 假设我们有三个用户,唐老鸭、米老鼠和布鲁托。这些表如下所示: 用户: Msg_系统: Userid msg_address 1 12345 1 donald.duck@duckburg.com 2 67890 正如我们所见,冥王星既没有电子邮件地址也没有手机号码(毕竟,他只
Userid msg_address
1 12345
1 donald.duck@duckburg.com
2 67890
正如我们所见,冥王星既没有电子邮件地址也没有手机号码(毕竟,他只是一只狗)。米老鼠有手机号码,但没有电子邮件地址
我现在想要得到的是这个结果:
Donald Duck donald.duck@duckborg.com
Mickey Mouse
Pluto
我希望每个用户都能被列出,不管他们是有电子邮件地址还是手机。然而,我只想要电子邮件地址,而不是手机号码
我尝试了一些联合版本,但我只能成功获得Donald两次,一次是他的电子邮件地址,一次是根本没有msgaddress(类似“@%”的msgaddress跳过手机)。对于get也不匹配的结果,您应该使用left join
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 + '%'
希望您使用的是
MSSQL
使用LEFT Join
与类似
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 + '%'
我建议:
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 '%@%;
将电子邮件地址和电话号码放在同一列中,而没有标识类型的列,这似乎是一个非常糟糕的设计
这将查找'@'
。显然还有其他方法可以区分这两者,但这似乎相对简单。请尝试下面的sql server查询:
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]
选择[first_name]+'+[last_name]+''
+Isnull([msg_地址],“”)
来自[dbo]。[用户]
左连接(选择*
来自[dbo]。[msg_系统]
其中Isnumeric([msg_address])1)f1
在[users].[userid]=f1.[userid]上
使用左连接….您认为使用临时表如何不需要临时表。您使用的是哪种dbms?您忘记了MSG的位置,例如“%@%”。为了连接字符数据,ANSI SQL使用了|运算符,而不是+
。我认为SQLServer有两种选择。有些产品具有concat()
功能。@jarlh MSSQL支持+我知道,但是| |
呢?|
将不受MSSQLOK支持。请注意,+null值
返回null。
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]