Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 多个字段的ISNULL/合并_Sql Server_Tsql_Join_Coalesce - Fatal编程技术网

Sql server 多个字段的ISNULL/合并

Sql server 多个字段的ISNULL/合并,sql-server,tsql,join,coalesce,Sql Server,Tsql,Join,Coalesce,考虑以下数据模型: 客户 CustNum | First Name | Last Name 555 John Doe CustNum | ShippingAddress| Line1 | Line2 | City | State | Zip 555 | ADD1 | 333 A Dr. | Apt. 10 | Dallas | TX | 11345 555 |

考虑以下数据模型:

客户

CustNum | First Name | Last Name
  555        John         Doe
CustNum | ShippingAddress|     Line1      |  Line2  |   City  | State |  Zip    
  555   |     ADD1       |   333 A Dr.    | Apt. 10 | Dallas  |  TX   | 11345  
  555   |     ADD2       |   111 B St.    |  NULL   | Miami   |  FL   | 22222
  555   |     WXYZ       |  123 Main St.  |  NULL   | Detroit |  MI   | 99998
OrdNum | CustNum | OrderTotal |     Line1     | Line2 |   City  | State|  Zip
 1000  |   555   |   67.00    | 123 Main St.  | Ste 1 | Detroit |  MI  | 99998
客户地址

CustNum | First Name | Last Name
  555        John         Doe
CustNum | ShippingAddress|     Line1      |  Line2  |   City  | State |  Zip    
  555   |     ADD1       |   333 A Dr.    | Apt. 10 | Dallas  |  TX   | 11345  
  555   |     ADD2       |   111 B St.    |  NULL   | Miami   |  FL   | 22222
  555   |     WXYZ       |  123 Main St.  |  NULL   | Detroit |  MI   | 99998
OrdNum | CustNum | OrderTotal |     Line1     | Line2 |   City  | State|  Zip
 1000  |   555   |   67.00    | 123 Main St.  | Ste 1 | Detroit |  MI  | 99998
OrderHeader

CustNum | First Name | Last Name
  555        John         Doe
CustNum | ShippingAddress|     Line1      |  Line2  |   City  | State |  Zip    
  555   |     ADD1       |   333 A Dr.    | Apt. 10 | Dallas  |  TX   | 11345  
  555   |     ADD2       |   111 B St.    |  NULL   | Miami   |  FL   | 22222
  555   |     WXYZ       |  123 Main St.  |  NULL   | Detroit |  MI   | 99998
OrdNum | CustNum | OrderTotal |     Line1     | Line2 |   City  | State|  Zip
 1000  |   555   |   67.00    | 123 Main St.  | Ste 1 | Detroit |  MI  | 99998
订单行

客户和客户地址之间存在一对多关系。
每个OrderHeader不是与CustomerAddresses表的键关系,而是将用于发货的地址存储在Line1、Line2、City、State和Zip字段中。
此外,还可以在OrderLine表中选择一个发货地址,该地址将覆盖OrderHeader中存储的地址。
我试图提出一个查询,以以下格式返回数据,生成邮件标签列表:
邮寄标签

基本上,如果订单行记录具有ShippingAddress值,我希望从CustomerAddresses表返回相应的地址。
如果为空,则返回OrderHeader表中存储的Line1、Line2、City、State和Zip值。
问题是,当我使用COALESCE或ISNULL时,可能会返回不正确的结果。我的问题是:

SELECT OH.OrderNo, Item, ISNULL(CA.Line1, OH.Line1), ISNULL(CA.Line2, OH.Line2),  
       ISNULL(CA.City, OH.City), ISNULL(CA.State, OH.State), ISNULL(CA.Zip, OH.Zip)
FROM   OrderHeader OH
JOIN   OrderLine OL
ON     OH.OrderNo = OL.OrderNo
LEFT JOIN   CustomerAddress CA
ON     OL.CustNum = CA.CustNum
AND    OL.ShippingAddress = CA.ShippingAddress  
在上述查询中,如果为OrderHeader定义了Line2字段,但在OrderLine中定义了ShippingAddress,则可以为Y234项返回混合地址:

OrderNo | Item |   Line1   |  Line2  |   City  | State |  Zip            
1000    | Y234 | 111 B St. |  Ste 1  |  Miami  |  FL   | 22222  
注意,Ste 1不是订单行中表示的地址的一部分,它实际上是订单头的一部分。

如何编写查询以所需方式返回数据?非常感谢您的任何帮助

不幸的是,我想不出一个简洁的方法来做到这一点而不重复

假设
OL
别名应该是
CA

SELECT OH.OrderNo, Item,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line1 ELSE CA.Line1 END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line2 ELSE CA.Line2 END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.City ELSE CA.City END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.State ELSE CA.State END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Zip ELSE CA.Zip END
FROM   OrderHeader OH
JOIN   OrderLine OL
ON     OH.OrderNo = OL.OrderNo
LEFT JOIN   CustomerAddress CA
ON     OL.CustNum = CA.CustNum
AND    OL.ShippingAddress = CA.ShippingAddress

不幸的是,我想不出一个简洁的方法来做到这一点而不重复

假设
OL
别名应该是
CA

SELECT OH.OrderNo, Item,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line1 ELSE CA.Line1 END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line2 ELSE CA.Line2 END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.City ELSE CA.City END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.State ELSE CA.State END,
       CASE WHEN OL.ShippingAddress IS NULL THEN OH.Zip ELSE CA.Zip END
FROM   OrderHeader OH
JOIN   OrderLine OL
ON     OH.OrderNo = OL.OrderNo
LEFT JOIN   CustomerAddress CA
ON     OL.CustNum = CA.CustNum
AND    OL.ShippingAddress = CA.ShippingAddress

您显示的SQL是不是匿名性很差?因为它似乎是从
OrderLine
OrderHeader
中提取的,并且在
ISNULL
语句中忽略了
CustomerAddress
?很抱歉,我将编辑此问题以修复不正确的别名。谢谢您的表结构似乎未正确正常化。您是否能够修改表结构,以便从订单标题中删除所有地址行,并替换为单个账单地址键?@MarkBannister您是对的,它们未正确标准化,但我无法更改基础表结构。您显示的SQL是否只是匿名性差?因为它似乎是从
OrderLine
OrderHeader
中提取的,并且在
ISNULL
语句中忽略了
CustomerAddress
?很抱歉,我将编辑此问题以修复不正确的别名。谢谢您的表结构似乎未正确正常化。您是否能够修改表结构,以便从订单标题中删除所有地址行,并替换为单个账单地址键?@MarkBannister您是对的,它们未正确正常化,但我无法更改基础表结构。我忘记了大小写,谢谢!我想你是对的,因为地址字段的确定必须基于特定的列。我忘记了大小写,谢谢!我认为你是对的,因为地址字段的确定必须基于特定的列。