我仍然是SQL的初学者,所以对于sifus来说这个问题可能很简单。
目前我有两张桌子:
表1(表1)
| ID | Name |
+----+-------+
| 1 | |
| | David |
| | John |
表2(表2)
| ID | Name | Mood
+----+-------+-------
| 1 | | Happy
| | David | Sad
| 3 | John | Angry
| 3 | John | Angry
预期产出:
| ID | Name | Mood
+----+-------+---------
| 1 | | Happy
| | David | Sad
| | John | Angry
我尝试做的是将表1与表2联系起来,如果ID存在,则在表2中搜索ID并获得心情,否则从表1到表2搜索名称并获得情绪。< / p>
这就是我现在所得到的:
Select tab1.id, tab1.name, tab2.mood
From tab1
Left Join tab2 on coalesce(tab1.id, tab2.id) = coalesce (tab1.name, tab2.name)
如果tab1和tab2在ID和名称上具有完全相同的结构,这将起作用,但是对于第三个示例,它采用tab1.name = tab2.id并且它没有得到正确的结果。有人可以指出我正确的方向吗?
有一点需要注意的是,我的count(*)
必须与tab1完全相同,因此如果tab2中有重复项,我只会获得匹配的第一个结果
答案 0 :(得分:0)
可能是一个简单的OR
是你想要的吗?
SELECT tab1.id,
tab1.name,
tab2.mood
FROM tab1
LEFT JOIN (SELECT DISTINCT tab2.id,
tab2.name,
tab2.mood
FROM tab2) tab2
ON tab2.id = tab1.id
OR tab2.name = tab1.name;
在你的问题的下一次编辑之前,还包括对应id名称对的不同情绪,这就是你获得“第一”的方式(但首先是指DBMS在执行查询时使用的任何顺序中的任何一个。您需要一个列来定义具有该确定性的顺序。)
SELECT tab1.id,
tab1.name,
coalesce((SELECT TOP 1
tab2.mood
FROM tab2
WHERE tab2.id = tab1.id),
(SELECT TOP 1
tab2.mood
FROM tab2
WHERE tab2.name = tab1.name))
FROM tab1;
(TOP 1
是SQL Server语法。我不知道你问题的哪个标签是你使用的实际DBMS。请考虑纠正它。)
答案 1 :(得分:0)
这似乎是left join
:
select distinct tab1.id, tab2.name, tab2.mood
from tab2 left join
tab1
on tab2.id = tab1.id
order by name;
Here是一个显示结果的rextester。
答案 2 :(得分:0)
我认为这会给你你想要的东西,但如果有很多数据,我认为它会很慢。此外,它不适合存在具有不同情绪的重复ID的位置 - 在这种情况下它将返回两种情绪。
SELECT distinct tab1.id, tab2.name, tab2.mood
FROM
tab1
LEFT JOIN tab2 ON
CASE WHEN tab1.id IS NOT NULL THEN tabl.id ELSE tab1.name END
= CASE WHEN tab1.id IS NOT NULL THEN tab2.id ELSE tab2.name END