2013-04-28 39 views
0

我并不完全确定如何标题我的问题,如果有人知道更好的标题,请随时编辑它。将一个表中的一列与另外两个表中的其他列结合起来sql

基本上我有一个问题,我不知道该怎么做。

我有一个数据库与传递地址和帐单地址。如果递送地址为空,我希望它显示帐单地址。我已经实现了这个使用:

SELECT DELIVERYADDRESS AS "Address" 
FROM SHOPORDER so 
UNION 
SELECT BILLINGADDR AS "Address" 
FROM CUSTOMER 

这样的作品。我也需要它与订单“连接”。所以我这样做:

SELECT ORDID FROM SHOPORDER 

我想是我的表看起来像
| ORDID | ADDRESS(DeliveryAddress或BillingAddress如果DeliveryAddress为null)

请注意,我的问题表指出我必须使用联合。我试过这个:

SELECT ORDID, (SELECT DELIVERYADDRESS FROM SHOPORDER 
    UNION 
     SELECT BILLINGADDR FROM CUSTOMER) 
FROM SHOPORDER 

但它不起作用。我一直在尝试一个小时,但我无法弄清楚。我试过内部连接,左连接,右连接等。我只是无法弄清楚。有人有什么主意吗?谢谢。

回答

0

既然你提到UNION是强制性

SELECT ORDID,DELIVERYADDRESS AS "Address" 
FROM SHOPORDER 
WHERE DELIVERYADDRESS IS NOT NULL 

UNION 

SELECT ORDID,BILLINGADDR AS "Address" 
FROM CUSTOMER 
WHERE ORDID IN (SELECT ORDID 
       FROM SHOPORDER 
       DELIVERYADDRESS IS NULL 
       ) 
+0

我不认为客户表中将列ORDERID – JBrooks 2013-04-28 05:34:59

+0

是啊,客户没有ORDID,这就是为什么我有这样的问题:/ – Anteara 2013-04-28 06:00:38

+0

@nhasan感谢您的解决方案,我能够想出一个解决方案,我会把你的标记为最佳答案,但我会也发布我的意见,任何人都有类似的情况。 – Anteara 2013-04-28 06:08:23

1

您可以使用聚结这样的:

选择ordid,凝聚(是DeliveryAddress,billingaddress)从 使用(客户ID)

shoporder加盟客户假定customerid是连接两个表的字段。 合并非常简单:如果第一个参数为null,则使用第二个参数。

--dmg

0
SELECT CUSTOMER.CustomerId, 
SHOPORDER.ORDERID, 
COALESCE(SHOPORDER.DELIVERYADDRESS, CUSTOMER.BILLINGADDR) AS "Address", 
CASE SHOPORDER.DELIVERYADDRESS IS NOT NULL THEN 'D' ELSE 'B' END AS AddressType, 
FROM CUSTOMER 
INNER JOIN SHOPORDER 
ON CUSTOMER.CustomerId = SHOPORDER.CustomerId 
0

我能够在mhasan的回答得到它的工作,通过查看:

SELECT ORDID,DELIVERYADDRESS AS "Address" 
FROM SHOPORDER so 
WHERE DELIVERYADDRESS IS NOT NULL 
UNION 
SELECT so.ORDID, c.BILLINGADDR AS "Address" 
FROM SHOPORDER so 
INNER JOIN CUSTOMER c 
ON so.CUSTID = c.CUSTID 
WHERE so.DELIVERYADDRESS IS NULL 
ORDER BY ORDID ASC 
+0

我很好奇,你为什么不使用coalesce?它将以更简单的语句(您在UNION中的第二次加入)完成,并且效率更高。 – dmg 2013-04-30 03:27:45

+0

我会结束你的好奇心dmg。这是我猜的分配! – SaK 2013-10-13 01:44:26

相关问题