Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL仅从两个不同的表中选择一条记录_Sql_Union_Distinct - Fatal编程技术网

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

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 正如我们所见,冥王星既没有电子邮件地址也没有手机号码(毕竟,他只

我有两张桌子。假设他们被称为用户和味精系统。 用户包含用户ID、名字和姓氏。 Msg_系统包含用户ID和Msg_地址。Msg_地址可以是电子邮件地址或手机号码。 假设我们有三个用户,唐老鸭、米老鼠和布鲁托。这些表如下所示: 用户:

Msg_系统:

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]