我不确定如何正确表达我的问题......
基本上,我有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 |
+-------+
答案 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