SQL连接有2列,如果存在,则第1列,否则为第2列

时间:2018-06-07 23:46:41

标签: sql sql-server

我仍然是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中有重复项,我只会获得匹配的第一个结果

3 个答案:

答案 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