1

我有两个表,我目前正在三个字段中加入:

SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A
   AND t1.B = t2.B
   AND t1.C = t2.C

由于我的数据的工作方式,如果 A/B/C 上的连接不匹配,那么我想在 A/B 上连接。如果该联接不匹配,那么我只想加入 A。这种类型的级联联接是否可以在 SQL 查询中进行(我使用的是 Oracle 10g)?还是我必须用代码处理这个?

4

3 回答 3

2

这对你有用吗?

  SELECT DISTINCT 
         t1.A,
         t1.B,
         t1.C,
         t2.D
    FROM t1, t2
   WHERE (t1.A = t2.A
          AND t1.B = t2.B
          AND t1.C = t2.C)
      OR (t1.A = t2.A
          AND t1.B = t2.B)
      OR (t1.A = t2.A);

编辑:

如果您想要所有结果但想查看它们是如何匹配的,那么您可以发出以下命令:

   SELECT t1.A,
          t1.B,
          t1.C,
          t2.D,
          (CASE 
              WHEN t1.A = t2.A
               AND t1.B = t2.B
               AND t1.C = t2.C
              THEN 'A/B/C'
              WHEN t1.A = t2.A
               AND t1.B = t2.B
              THEN 'A/B'
              WHEN t1.A = t2.A
              THEN 'A'
              ELSE 'None'
           END) AS match_criteria
     FROM t1, t2
    WHERE t1.A = t2.A; 

在结果集中,您可以查看行的匹配级别,然后使用那里的数据。也许通过将此查询包装在外部查询中,您可以丢弃您不想要的行或优先处理您想要的行。

希望能帮助到你...

于 2012-04-17T14:57:41.750 回答
2

您可以通过将三个查询联合在一起并在两个更一般的查询中排除在更具体的查询中返回的行来做到这一点。

您如何确定要从更一般的查询中排除哪些行取决于数据的形状,但您可以尝试以下操作:

SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C
UNION 
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A AND t1.B = t2.B 
  AND NOT EXISTS (SELECT * FROM t2 WHERE t2.A = t1.A AND t2.B = t1.B AND t2.C = t1.C)
UNION
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A
  AND NOT EXISTS (SELECT * FROM t2 WHERE t2.A = t1.A AND t2.B = t1.B)
于 2012-04-17T15:11:24.417 回答
0
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1
  LEFT JOIN t2
  ON t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C

试试这个并检查你是否喜欢结果,如果不喜欢,使用这个(psedo.code):

insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C

IF select count(*) from #temptable = 0 then
insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A AND t1.B = t2.B
end if;


IF select count(*) from #temptable = 0 then
insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A
end if;

select * from #temptable
drop #temptable
于 2012-04-17T14:29:00.513 回答