如何加入2个列并删除一些观察但保留其他观察结果?

时间:2018-04-20 16:51:29

标签: sql sql-server join

我不确定如何正确表达我的问题......

基本上,我有2列,每列有大约2500个观测值。一个是存在的位置目录(list1),另一个是位置列表,无论它们是否存在(list2)。我想做一个内连接,这样我就可以保留list1中存在的所有位置,并从list2中删除那些不存在的位置。但是我想要保留一个特别是111的位置,而不是list1中存在位置的位置。所以我认为我可以使用 where子句进行左连接,但我不确定我的where子句应该是什么样子。

例如,

+-------+--------+
| list1 |  list2 |
+-------+--------+
|    22 |     22 |
|    33 |     33 |
|    49 |     42 |
|    51 |     49 |
|    78 |     51 |
|   100 |     55 |
|       |     59 |
|       |     78 |
|       |    100 |
|       |    111 |
+-------+--------+

所以我希望我的新列表看起来像这样:

+-------+
|  list |
+-------+
|    22 |
|    33 |
|    49 |
|    51 |
|    78 |
|   100 |
|   111 |
+-------+

4 个答案:

答案 0 :(得分:1)

您可以使用union all

select l1.location
from list1 l1
where exists (select 1 from list2 l2 where l2.location = l1.location)
union all
select 111;

某些数据库可能需要from子句用于第二个查询,例如from dual

答案 1 :(得分:1)

如果您使用的是TSQL,您还可以使用FULL JOIN:

SELECT *
FROM list1 l1
FULL JOIN list2 l2 ON l1.location = l2.location
WHERE l1.location IS NOT NULL
OR l2.location = 111

答案 2 :(得分:0)

如果我理解正确,这应该有用 (这可以生成您在上面显示的预期结果。)

Select list1 from yourTable
Union
Select list2 from yourTable

此外,这些链接可能会对您有所帮助 https://www.w3schools.com/sql/sql_join.asp
https://www.w3schools.com/sql/sql_union.asp

如果我误解了你,请告诉我。

答案 3 :(得分:0)

抱歉,我没有得到你的要求: 根据您的描述,它是list1和111?

     WITH testdata(list1,list2
      )AS (
        SELECT 22,22 UNION ALL 
        SELECT 33,33 UNION ALL 
        SELECT 49,42 UNION ALL 
        SELECT 51,49 UNION ALL 
        SELECT 78,51 UNION ALL 
        SELECT 100,55 UNION ALL 
        SELECT 0,59 UNION ALL 
        SELECT 0,78 UNION ALL 
        SELECT 0,100 UNION ALL 
        SELECT 0,111
    )

    SELECT list2 FROM testdata
    INTERSECT
    SELECT list1 FROM testdata 
    UNION
    SELECT 111

它将返回:

list
22
33
49
51
78
100
111