SQL 两个连接;第一个左连接;其次仅在组合尚不存在时加入

SQL Two joins; First one a left join; second only join when combination does not exist yet

我有以下问题。我有以下 3 tables,我无法编辑它们。我有一个“主”table 我想加入“Table1”,我成功了(见fiddle)。下一步是加入“Table2”,但前提是 Charge-Name 组合尚不存在。如果不存在,请添加它并将 Factor 设置为 0。请参阅 table“Desired result”以了解我的目标.

http://sqlfiddle.com/#!9/fc7409/1

代码:

SELECT  Main.Charge,
        Main.Id,
        Table1.Name,
        Table1.Factor
FROM Main
Left JOIN Table1
ON Main.Charge = Table1.Charge

表格:

Main           Table1                  Table2       Desired result  
+------+--+    +------+----+------+    +--+----+    +------+--+----+------+
|Charge|Id|    |Charge|Name|Factor|    |ID|Nom |    |Charge|ID|Name|Factor|
+------+--+    +------+----+------+    +--+----+    +------+--+----+------+
| 1001 |5 |    | 1001 |ZZZ | 12   |    |5 |ZZZ |    | 1001 |5 |ZZZ | 12   |
| 1002 |8 |    | 1001 |XXX | 25   |    |5 |XXX |    | 1001 |5 |XXX | 25   |
| 1003 |10|    | 1002 |AAA | 15   |    |5 |OOO |    | 1001 |5 |OOO | 0    |
| 1006 |5 |    | 1003 |YYY | 1    |    |8 |AAA |    | 1002 |8 |AAA | 15   |
+------+--+    | 1003 |BBB | 32   |    |10|YYY |    | 1003 |10|YYY | 1    |
               | 1006 |ZZZ | 9    |    |10|UUU |    | 1003 |10|BBB | 32   |
               | 1006 |XXX | 14   |    |21|PPP |    | 1003 |10|UUU | 0    |
               | 1006 |RRR | 57   |    +--+----+    | 1006 |5 |ZZZ | 9    |
               | 1011 |TTT | 11   |                 | 1006 |5 |XXX | 14   |
               | 1011 |SSS | 1    |                 | 1006 |5 |RRR | 57   |
               +------+----+------+                 +------+--+----+------+

你可以尝试使用子查询来UNION ALL两个结果集,一个是from Main join Table1 另一个是from Main join Table2.

Table2 需要写一列 Factor 为 0

然后使用聚合函数得到你的结果。

查询 1:

SELECT Charge,ID,Name,SUM(Factor) Factor
FROM (
  SELECT m.Charge,m.ID,t1.Name , t1.Factor
  FROM `Main` m
  INNER JOIN `Table1` t1
  ON m.Charge = t1.Charge
  UNION ALL
  SELECT m.Charge,t2.ID,t2.Nom , 0 Factor
  FROM `Main` m
  INNER JOIN `Table2` t2
  ON m.ID = t2.ID
) t1
GROUP BY Charge,ID,Name
ORDER BY Charge

Results:

| Charge | ID | Name | Factor |
|--------|----|------|--------|
|   1001 |  5 |  ZZZ |     12 |
|   1001 |  5 |  XXX |     25 |
|   1001 |  5 |  OOO |      0 |
|   1002 |  8 |  AAA |     15 |
|   1003 | 10 |  YYY |      1 |
|   1003 | 10 |  UUU |      0 |
|   1003 | 10 |  BBB |     32 |
|   1006 |  5 |  ZZZ |      9 |
|   1006 |  5 |  XXX |     14 |
|   1006 |  5 |  RRR |     57 |
|   1006 |  5 |  OOO |      0 |
SELECT  Main.Charge,
        Main.Id,
        Table2.Nom,
        CASE WHEN Table2.Name = Table2.Nom
                 THEN Table1.Factor 
                 ELSE 0
        END CASE AS Factor
FROM Main
LEFT JOIN Table1
ON Main.Charge = Table1.Charge
LEFT JOIN Table2
ON Main.Id = Table2.ID

使用 CASE-Statement,您可以 select 不同的值,具体取决于您将在 WHERE-part 中使用的条件。在这里,您可以使用它来将您的“因素”结果设置为所需的值,具体取决于收费的现有名称。