0

让我试着解释一下这个场景。我有两个表 A(列 - A1、A2、A3)和 B(列 - B1、B2、B3)。我需要在 A1.B2 上将表 A 与表 B 连接起来。对于每个连接,表 B 有一个或两个具有不同 B3 值的记录(X 或 Y)。我想编写一个查询,其中 JOIN 查询需要选择 B3=X 的行(如果没有其他 B3=Y 的行);如果存在两行(B3=X & B3=Y),则查询只需选择 B3=Y 的行(忽略 B3=X 的行)。

让我试着给表格一些价值并解释更多。

表 A
********
A1 A2 A3
1 11 111
2 22 222
3 33 333
4 44 444

表 B
********
B1 B2 B3
6 1 X
7 1 是
8 2 X
9 3 X
10 3 是
11 4 X

再次.. JOIN 在 A1.B2 上。结果应该如下,

加入结果
*************
A1 A2 A3 B1 B2 B3
1 11 111 7 1 是
2 22 222 8 2 X
3 33 333 10 3 是
4 44 444 11 4 X

如果你们对我的问题有任何澄清,请告诉我。

提前致谢。瑜伽士

4

4 回答 4

3

ROW_NUMBER如果您按连接列分区并按“选择顺序”列排序,则可以使用函数从表 B 中选择行:

SELECT b1, b2, b3,
       ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
  FROM b;

1 Y 1
1 X 2
2 X 1
3 Y 1
3 X 2
4 X 1

然后您可以过滤第一行,即rn=1

SELECT b1, b2, b3
  FROM (SELECT b1, b2, b3,
               ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
          FROM b)
 WHERE rn=1;

7  1 Y
8  2 X
10 3 Y
11 4 X

然后可以将过滤后的行连接到表 a:

SELECT *
  FROM a 
  JOIN (
        SELECT b1, b2, b3
          FROM (SELECT b1, b2, b3,
                       ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY b3 DESC) as rn
                  FROM b
                )
          WHERE rn=1
       ) bfilter  ON a.a1 = bfilter.b2;

1 11 111  7 1 Y
2 22 222  8 2 X
3 33 333 10 3 Y
4 44 444 11 4 X   

如果 'X' 和 'Y' 不是实际值,您可以使用语句扩展ORDER子句CASE以允许一般值:

 ROW_NUMBER() OVER (PARTITION BY b2 ORDER BY 
   CASE b3 WHEN 'Y' THEN 1
           WHEN 'X' THEN 2
           ...
    END ASC)

编辑:

 SELECT a1, a2, a3, b1, b2, b3
   FROM (
         SELECT a1, a2, a3, b1, b2, b3,
                ROWNUMBER() OVER (PARTITION BY a1 ORDER BY 
                   CASE WHEN a2=... AND b3=... THEN 1
                        WHEN a2=... AND b3=... THEN 2
                        ...
                   END ASC)
          FROM a JOIN b ON a.a1 = b.b2
        ) 
  WHERE rn = 1;
于 2013-01-10T09:39:25.303 回答
1

您可以按如下方式使用左外连接

select A.A1, A.A2, A.A3, 
nvl(BT1.B1, BT2.B1), 
nvl(BT1.B2, BT2.B2),
nvl(BT1.B3, BT2.B3) from A 
left outer join B BT1 on A.A1 = BT1.B2 and BT1.B3 = 'Y'
left outer join B BT2 on A.A1 = BT2.B2 and BT2.B3 = 'X'

各种连接的一个很好的解释是http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

于 2013-01-10T09:24:19.057 回答
0

这是,我会怎么做:

  • 加入
  • 按 B2 分组
  • 取最大值(B3)

这样,当没有可用的字母顺序较高的值 (Y) 时,您可以确保仅选择 X

于 2013-01-10T09:19:56.227 回答
0

与联合

select a.*,b.* from a,b
where a.a1=b.b2
and b.b3='Y'
union
select a.*,b.* from a,b
where a.a1=b.b2
and not exists (select bb.br from b bb where bb.b2=a.a1 and bb.b3='Y')

没有 UNION

select a.*,b.* from a,b
where a.a1=b.b2
and (b.b3='Y'
or not exists (select bb.b3 from b bb where bb.b2=a.a1 and bb.b3='Y'))

这里的约束是 B 对于每个 A 的行恰好有 1 或 2 行

于 2016-11-01T13:44:16.227 回答