我有两个表A和B。我想返回A中的所有记录,而只返回B中的匹配项。为此,我可以使用左连接。但是加入后,我想基于同一表中的标志返回记录。
Table A: | Col1 | Col2 | |------|------| | 123 | 12 | | 456 | 34 | | 789 | 56 | Table B: | Col1 | Col2 | Col3 | Col4 | Col5 | |------|------|------|------|------| | 123 | 12 | NULL | I | 1 | | 456 | 34 | NULL | E | 1 | | 111 | 98 | NULL | I | 1 | | 222 | 99 | NULL | E | 1 | | 123 | 12 | AB | NULL | 2 | | 456 | 34 | CD | NULL | 2 | | 123 | 12 | EF | NULL | 2 | | 111 | 98 | GH | NULL | 2 | | 222 | 99 | IJ | NULL | 2 |
离开A和B后,结果将如下所示:
| Col1 | Col2 | Col3 | Col4 | Col5 | |------|------|------|------|------| | 123 | 12 | NULL | I | 1 | | 456 | 34 | NULL | E | 1 | | 123 | 12 | AB | NULL | 2 | | 456 | 34 | CD | NULL | 2 | | 123 | 12 | EF | NULL | 2 | | 789 | 56 | NULL | NULL | NULL |Col5中的
1和2值指示应填充Col4还是Col3。 Col4为1,Col3为2。
我想在Col4中返回所有'I'的记录(但不包括具有'I'的记录),
| Col1 | Col2 | Col3 | Col4 | Col5 |
|------|------|------|--------|------|
| 123 | 12 | AB | (null) | 2 |
| 123 | 12 | EF | (null) | 2 |
我还想返回col4中'E'的记录(再次排除具有'E'的记录),但返回Col3中一个值以外的所有值。在这种情况下,CD。看起来像这样:
| Col1 | Col2 | Col3 | Col4 | Col5 | |------|------|------|--------|------| | 456 | 34 | AB | (null) | 2 | | 456 | 34 | EF | (null) | 2 | | 456 | 34 | GH | (null) | 2 | | 456 | 34 | IJ | (null) | 2 |
有人可以建议如何在SQL中处理此问题吗?
答案 0 :(得分:1)
好的,我相信以下两个查询可以达到您想要的结果。您可以通过以下here查看所有示例代码。
存在规则:
select A.*
, B.Col3
, B.Col4
, B.Col5
from TableA A
JOIN TableB B
on A.Col1 = B.Col1
and A.Col2 = B.Col2
and B.Col5 = 2
where exists (select 1 from TableB C
where C.col1 = B.col1 and C.col2 = B.col2
and c.col4 = 'I' AND C.col5 = 1)
| Col1 | Col2 | Col3 | Col4 | Col5 |
|------|------|------|--------|------|
| 123 | 12 | AB | (null) | 2 |
| 123 | 12 | EF | (null) | 2 |
排除规则:
select A.*
, B.Col3
, B.Col4
, B.Col5
from TableA A
CROSS JOIN TableB B
where b.col5 = 2
and exists (select 1 from TableB C
where C.col1 = a.col1 and C.col2 = a.col2
and c.col4 = 'E' AND C.col5 = 1)
and b.col3 not in (select col3 from TableB b
where b.col1 = a.col1 and b.col2 = a.col2 and b.col5 = 2)
Results :
| Col1 | Col2 | Col3 | Col4 | Col5 |
|------|------|------|--------|------|
| 456 | 34 | AB | (null) | 2 |
| 456 | 34 | EF | (null) | 2 |
| 456 | 34 | GH | (null) | 2 |
| 456 | 34 | IJ | (null) | 2 |
答案 1 :(得分:0)
我的结果:-
;with cte1 As(select a.col1,a.col2 from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 = 'I'),cte2 As(select b.col3,b.col4,b.col5 from from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 <> 'I')
E的结果:-
select a.col1,a.col2,b.col3,b.col4,b.col5 from cte1 a cross join cte2 b
;with cte1 As(select a.col1,a.col2 from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 = 'E'),cte2 As(select b.col3,b.col4,b.col5 from from A a left join B b on a.col1 =b.col2 and a.col2=b.col2 where b.col4 <> 'E')
select a.col1,a.col2,b.col3,b.col4,b.col5 from cte1 a cross join cte2 b
答案 2 :(得分:-1)
select c.col1, c.col2
from
(select a.col1, a.col2, b.col3 from a inner join table b on a.id = b.id
where "condition" ) c
where c.col1 = "condition"
这是脚本。解释是:
在()中,我编写了第一个选择。在那里,您将根据联接和条件进行选择。在选择的最后,我写了“ c”,它是从子选择生成的表的名称。 然后,您将从生成的表中选择一些值,并使用对其进行过滤,该值将作用于由子选择创建的表所生成的结果
编辑:我使用您问题的名称来简化此操作