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
| 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 中使用的条件。在这里,您可以使用它来将您的“因素”结果设置为所需的值,具体取决于收费的现有名称。
我有以下问题。我有以下 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
| 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 中使用的条件。在这里,您可以使用它来将您的“因素”结果设置为所需的值,具体取决于收费的现有名称。