SQL加入三个Table; Return 来自 Table 1 的值,其中 Table 2 中的所有实例都具有相同的字段值
SQL Join Three Tables; Return Values from Table 1 where all instances in Table 2 have the same field value
我有三个 table 需要连接在一起。具体来说,table 1 需要加入 table 2,table 2 加入 table 3。我需要 return 来自 table 1 的值,其中selected in table 1 in table 2 的值的所有实例都有一个具有某个值的字段,然后通过我在 table 3 上的加入进一步 selected .举个例子可能更容易
Table 1
Order
Status
001
A
002
A
003
B
004
B
005
A
Table 2
Box
Status
Order
Shipment
1
X
001
1
2
X
001
2
3
X
002
1
4
X
003
2
5
X
003
2
6
Y
004
1
7
X
004
2
8
X
004
1
9
Y
005
1
Table 3
Shipment
Status
1
C
2
A
我需要 select 来自 table 1 的所有处于状态 'A' 并且绑定到 table 2 中的箱子的所有订单,其中所有箱子订单处于状态 'X' 并绑定到 table 3 中状态 'C'.
的发货
我的最终结果应该return如下:
Order
002
我有以下内容,但不是 100% 准确,因为 Table2.Shipment 可以是空白值。我真正的问题是很难找到来自 table1 的订单,其中 table2 中该订单的所有箱子都处于相同状态。
SELECT order
FROM table1
JOIN table2 ON table1.order = table2.order
WHERE table2.order NOT IN
(SELECT table2.order FROM table2
JOIN table3 ON table2.shipment=table3.shipment
WHERE table3.status = 'A')
AND table2.order IN
(SELECT table2.order FROM table2
JOIN table3 ON table2.order = table3.order
WHERE table3.status = 'C')
AND table1.status = 'A'
AND table2.status = 'X'
您可以使用聚合,并使用 having 子句过滤 t2
和 t3
:
select t1.orderid
from table1 t1
inner join table2 t2 on t2.orderid = t1.orderid
inner join table3 t3 on t3.shipment = t2.shipment
where t1.status = 'A'
group by t1.orderid
having max(case when t2.status <> 'X' then 1 else 0 end) = 0
and max(case when t3.status <> 'C' then 1 else 0 end) = 0
我有三个 table 需要连接在一起。具体来说,table 1 需要加入 table 2,table 2 加入 table 3。我需要 return 来自 table 1 的值,其中selected in table 1 in table 2 的值的所有实例都有一个具有某个值的字段,然后通过我在 table 3 上的加入进一步 selected .举个例子可能更容易
Table 1
Order | Status |
---|---|
001 | A |
002 | A |
003 | B |
004 | B |
005 | A |
Table 2
Box | Status | Order | Shipment |
---|---|---|---|
1 | X | 001 | 1 |
2 | X | 001 | 2 |
3 | X | 002 | 1 |
4 | X | 003 | 2 |
5 | X | 003 | 2 |
6 | Y | 004 | 1 |
7 | X | 004 | 2 |
8 | X | 004 | 1 |
9 | Y | 005 | 1 |
Table 3
Shipment | Status |
---|---|
1 | C |
2 | A |
我需要 select 来自 table 1 的所有处于状态 'A' 并且绑定到 table 2 中的箱子的所有订单,其中所有箱子订单处于状态 'X' 并绑定到 table 3 中状态 'C'.
的发货我的最终结果应该return如下:
Order |
---|
002 |
我有以下内容,但不是 100% 准确,因为 Table2.Shipment 可以是空白值。我真正的问题是很难找到来自 table1 的订单,其中 table2 中该订单的所有箱子都处于相同状态。
SELECT order
FROM table1
JOIN table2 ON table1.order = table2.order
WHERE table2.order NOT IN
(SELECT table2.order FROM table2
JOIN table3 ON table2.shipment=table3.shipment
WHERE table3.status = 'A')
AND table2.order IN
(SELECT table2.order FROM table2
JOIN table3 ON table2.order = table3.order
WHERE table3.status = 'C')
AND table1.status = 'A'
AND table2.status = 'X'
您可以使用聚合,并使用 having 子句过滤 t2
和 t3
:
select t1.orderid
from table1 t1
inner join table2 t2 on t2.orderid = t1.orderid
inner join table3 t3 on t3.shipment = t2.shipment
where t1.status = 'A'
group by t1.orderid
having max(case when t2.status <> 'X' then 1 else 0 end) = 0
and max(case when t3.status <> 'C' then 1 else 0 end) = 0