SQL Join基于分层标准

时间:2014-09-25 12:53:49

标签: sql join

我需要将三个表格内连接以形成第三个表格。

第一个表(Basic)如下所示:

+----------+----------+---------+------------+
| Order No | Supplier | Product |    Date    |
+----------+----------+---------+------------+
|      100 | SuppCo   | Shirt   | 25.09.2014 |
|      101 | SuppCo   | Pants   | 25.09.2014 |
|      102 | SuppCo   | Shirt   | 25.09.2014 |
+----------+----------+---------+------------+

第二个表格(颜色)如下所示:

+------+--------+
|  ID  | Color  |
+------+--------+
| 1ABC | yellow |
| 1ABD | red    |
| 1ABE | pink   |
| 1ABF | orange |
| 1ABG | teal   |
| 2DEG | green  |
| 3HIK | blue   |
+------+--------+

第三个表(详情)如下所示:

+------+----------+-----------+
|  ID  | Order No | Order Ext |
+------+----------+-----------+
| 1ABC |      100 | -         |
| 1ABD |      100 | Prime     |
| 1ABE |      100 | Basic1    |
| 1ABF |      100 | Basic2    |
| 1ABG |      100 | Basic3    |
+------+----------+-----------+

决赛桌应如下所示:

+----------+------+-------+------------+
| Order No |  ID  | Color |    Date    |
+----------+------+-------+------------+
|      100 | 1ABD | red   | 25.09.2014 |
|      101 | 2DEG | green | 25.09.2014 |
|      102 | 3HIK | blue  | 25.09.2014 |
+----------+------+-------+------------+

该表基于Basic表,我在其中使用订单号和日期。 从订单号,我想从Detail表中获取ID。

BasicDetail之间的联接应具有以下条件: 加入相同的订单号,并获取Order Ext = 'Prime'的ID,如果Prime不作为扩展名存在,那么Order Ext = '-'如果不存在,则接受其余的任何一个(在此处无关紧要)这点)。 在此之后,应该获取ID并从Color表中获取正确的行。

我正在考虑Row Over,但这是非常耗费资源的,所以我在考虑是否有更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

我会在详细信息中添加一个列,您可以在其中为此行提供优先级。 然后你可以使用这个SELECT:

SELECT B.Order_No, C.ID, C.Color, B.Date
FROM [Basic] B
INNER JOIN Detail D ON B.Order_No = D.Order_No 
    AND D.ID = (SELECT TOP 1 D1.ID 
                FROM Detail D1
                WHERE D1.Order_No = B.Order_No
                ORDER BY D1.OrderPriority ASC)
INNER JOIN Color C ON C.ID = D.ID