1

我有两个表 A 和 B。我想从 A 返回所有记录,并且只从 B 匹配。我可以为此使用左连接。但是加入后,我想根据同一张表中的标志返回记录。

表 A:

| Col1 | Col2 |
|--------|--------|
| 123 | 12 |
| 第456章 34 |
| 第789章 56 |

表 B:

| Col1 | Col2 | Col3 | Col4 | Col5 |
|-----|------|------|------|------|
| 123 | 12 | 空 | 我 | 1 |
| 第456章 34 | 空 | E | 1 |
| 111 | 98 | 空 | 我 | 1 |
| 222 | 99 | 空 | E | 1 |
| 123 | 12 | AB | 空 | 2 |
| 第456章 34 | 光盘 | 空 | 2 |
| 123 | 12 | 英孚 | 空 | 2 |
| 111 | 98 | 生长激素 | 空 | 2 |
| 222 | 99 | IJ | 空 | 2 |

左加入 A 和 B 后,结果将如下所示:

| Col1 | Col2 | Col3 | Col4 | Col5 |
|-----|------|------|------|------|
| 123 | 12 | 空 | 我 | 1 |
| 第456章 34 | 空 | E | 1 |
| 123 | 12 | AB | 空 | 2 |
| 第456章 34 | 光盘 | 空 | 2 |
| 123 | 12 | 英孚 | 空 | 2 |
| 第789章 56 | 空 | 空 | 空 |

Col5 中的 1 和 2 值告诉是否应该填充 Col4 或 Col3。1 用于 Col4,2 用于 Col3。

我想返回 Col4 中“I”的所有记录(但不包括具有“I”的记录),如下所示:

| Col1 | Col2 | Col3 |   Col4 | Col5 |
|------|------|------|--------|------|
|  123 |   12 |   AB | (null) |    2 |
|  123 |   12 |   EF | (null) |    2 |

我还想返回 col4 中“E”的记录(再次排除具有“E”的记录),但返回 Col3 中除一个以外的所有值。在这种情况下光盘。看起来像这样:

| Col1 | Col2 | Col3 | Col4 | Col5 |
|--------|------|------|--------|------|
| 第456章 34 | AB | (空) | 2 |
| 第456章 34 | 英孚 | (空) | 2 |
| 第456章 34 | 生长激素 | (空) | 2 |
| 第456章 34 | IJ | (空) | 2 |

有人可以建议如何在 SQL 中处理这个问题吗?

4

3 回答 3

1

好的,我相信以下两个查询可以达到您想要的结果。您可以通过以下SQL Fiddle查看所有示例代码。

存在规则

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)

结果

| 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 |
于 2019-01-18T22:54:33.507 回答
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 
于 2019-01-18T17:10:41.193 回答
-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”,这是从子选择生成的表的名称。然后,您将从生成的表中选择一些值并使用将作用于使用子选择创建的表生成的结果的位置过滤它们

编辑:我用你的问题的名字让它更容易

于 2019-01-18T16:11:30.003 回答