2011-04-12 62 views
2

措辞不好,因为我对SQL中的这些操作不太熟悉,假设我有一个表的东西分区,另一个表中有一个名为address_state的表。我希望能够加入对ADDRESS_STATE的UCASE等于要么STATE_ABBREVIATION或STATE_NAMESQL如果连接不匹配然后加入其他东西

EG:

SELECT orders.total_value, territories.territory FROM orders 
INNER JOIN tblCanadianTerritories ON 
UCASE(orders.technical_address_state) = tblCanadianTerritories.state 
OR 
tblCanadianTerritories ON 
UCASE(orders.technical_address_state) = tblCanadianTerritories.name 

WHERE UCASE(orders.technical_address_country) = "CANADA" 

编辑:

既然来了两个可能的解决方案:

SELECT so_order.id, so_order.date_entered, so_order.check_if_new_customer, tblCanadianTerritories.territory, so_order.total_value FROM so_order 
INNER JOIN tblCanadianTerritories ON 
UCASE(so_order.technical_address_state) = tblCanadianTerritories.state 
OR 
UCASE(so_order.technical_address_state) = tblCanadianTerritories.name 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 
ORDER BY so_order.date_entered ASC 

OR

SELECT so_order.id, so_order.date_entered, so_order.check_if_new_customer, 

tblCanadianTerritories.territory, so_order.total_value FROM so_order 
INNER JOIN tblCanadianTerritories ON UCASE(so_order.technical_address_state) = 

tblCanadianTerritories.state 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 
ORDER BY so_order.date_entered ASC 
UNION 
SELECT so_order.id, so_order.date_entered,so_order.check_if_new_customer, 

tblCanadianTerritories.territory, so_order.total_value FROM so_order 
INNER JOIN tblCanadianTerritories ON UCASE(so_order.technical_address_state) = 

tblCanadianTerritories.name 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 
ORDER BY so_order.date_entered; 

但他们都似乎检索不同的结果。

+0

你可能有一个错误。您正在使用名为tblCana​​dianTerritories的表/视图加入名为orders的表/视图。然后你引用一个名为so_order的表/视图。订单和订单是错误的吗? – 2011-04-12 17:24:44

+0

是的,消毒。 – davidahines 2011-04-12 17:49:46

回答

4

试试这个:

SELECT orders.total_value, territories.territory 
    FROM orders AS so_order INNER JOIN tblCanadianTerritories 
     ON (
      UCASE(so_order.technical_address_state) = tblCanadianTerritories.state 
      OR 
      UCASE(so_order.technical_address_state) = tblCanadianTerritories.name 
      ) 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 

如果你想使用UNION,试试这个:

SELECT orders.total_value, territories.territory 
    FROM orders AS so_order INNER JOIN tblCanadianTerritories 
     ON UCASE(so_order.technical_address_state) = tblCanadianTerritories.state 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 
UNION 
SELECT orders.total_value, territories.territory 
    FROM orders AS so_order INNER JOIN tblCanadianTerritories 
     ON UCASE(so_order.technical_address_state) = tblCanadianTerritories.name 
WHERE UCASE(so_order.technical_address_country) = "CANADA" 
+0

工会选择会做同样的事情吗? – davidahines 2011-04-12 17:19:34

+1

@dah:是的,我使用UNION查询更新了这篇文章。 – Chandu 2011-04-12 17:21:35

+1

@dah在琐碎的情况下是(如在原始问题中),但是如果您的陈述变得更加复杂,则否否 – 2011-04-12 17:22:00

2

你并不需要一个单独的连接。试试这个:

SELECT o.total_value, territories.territory 
FROM orders AS o 
INNER JOIN tblCanadianTerritories AS ct ON 
UCASE(o.technical_address_state) = ct.state 
OR 
UCASE(o.technical_address_state) = ct.name 
WHERE UCASE(o.technical_address_country) = "CANADA" 

(现在的别名)

+0

我希望我能选择两个答案,这个答案也很棒。有一艘快艇。 – davidahines 2011-04-12 17:43:26