【问题标题】:SQL Join two tables with different number of rows get all rows from one tableSQL Join 两个不同行数的表从一个表中获取所有行
【发布时间】:2014-11-19 16:40:14
【问题描述】:

我正在尝试连接具有不同行数的两个表。客户编号是两个表中的标识字段。

第一个表包括所有客户的客户编号。 所以任何一个都可以被引用)。更复杂的是,ClientNumber2 字段是一个文本字段,但我需要它是一个数字,就像其他客户编号字段一样。第二个表中还有一个区域字段,我需要将其限制为某些区域编号。 第二个表仅包含满足特定规格的客户的客户编号。第二个表中的一些客户有第二个客户编号。

我想创建一个新列,为第二个表中不存在的所有客户显示第一个表中的客户编号,如果存在,则在第二个表中显示第二个客户编号,否则,客户编号来自第一个表(与第二个表第一列的客户编号相同

我在下面包含了我正在使用的语法。它运行没有错误。 OriginalCN 字段为那些在表 2 的 ClientNumber2 中具有值的人返回所需的值,但为所有其他人返回空值。我无法弄清楚如何让它正常工作。我还包括示例表和我想要的表。非常感谢任何帮助!

CLIENT TABLE 1
CLIENT NUMBER
1
2
3
4
5
6
7
8

CLIENT TABLE 2  
CLIENT NUMBER   2ND CLIENT NUMBER     REGION
2                 14                    1
6                                       2
8                 15                    2

DESIRED RESULT
1
14
3
4
5
6
7
15

这是我使用的语法:

SELECT
TABLE2.CLIENTNUMBER
TABLE1.CLIENTNUMBER

CASE
WHEN TABLE2.CLIENTNUMBER IS NULL THEN TABLE1.CLIENTNUMBER

WHEN TABLE2.CLIENTNUMBER2 IS NULL THEN TABLE2.CLIENTNUMBER

WHEN TABLE2.CLIENTNUMBER2 = ' ' THEN TABLE2.CLIENTNUMBER

ELSE
CAST(TABLE2.CLIENTNUMBER2 AS INT)

END AS OriginalCN

FROM DSS.DBO.TABLE1
LEFT OUTER JOIN
RPTO.DBO.TABLE2
ON
DSS.DBO.TABLE1.CLIENTNUMBER = RPTO.DBO.TABLE2.CLIENTNUMBER

WHERE TABLE2.REGION IN (1,2,3)

【问题讨论】:

  • 在询问有关 Sql Server 的问题时不要使用 MySQL 标签。它们是两种截然不同的数据库产品。
  • 您的WHERE 子句完全否定了左外连接。如果 TABLE2 中没有对应的行,则 REGION 将为 NULL,即不是 IN (1,2,3)
  • 我以为我在示例表中显示了区域值,但如果没有出现,我认为这不是问题所在。在实际的表 2 中,所有行都有一个区域值(没有一个为空),并且在 1、2 和 3 中有很多行。
  • @JoelCoehoorn 我很抱歉。我对 SQL 编程和语言非常非常陌生。我没有意识到这一点。

标签: sql sql-server join case


【解决方案1】:

试试这个:

SELECT COALESCE(CAST(NULLIF(t2.ClientNumber2,' ') As Int), t1.ClientNumber) As ClientNumber
FROM DSS.DBO.TABLE1 t1
LEFT JOIN RPTO.DBO.TABLE2 t2 ON t1.CLIENTNUMBER = t2.CLIENTNUMBER
WHERE COALESCE(t2.REGION, 1) IN (1,2,3)   

【讨论】:

  • 这可能是我第一次使用NULLIF()函数。
  • 非常感谢您花时间回复。这工作没有错误,但仍然没有返回所需的结果。
  • 我对您的建议所做的唯一更改是我在 Select 和 Coalesce 之间添加了表 1 中的客户编号,因为我还希望包含该列。我想我应该把它放在我的“期望结果”表中——我想要两列——一列显示新的客户编号字段,另一列显示表 1 中的客户编号。你认为我的添加是什么搞砸了吗?
  • 您需要在选择列表中的列名之间使用逗号。如果你有,那应该没问题。
【解决方案2】:

试试这个..

CREATE TABLE #CLIENT_TABLE_1
  (CLIENTNUMBER INT)

INSERT #CLIENT_TABLE_1
VALUES (1),(2),(3),(4),(5),(6),(7),(8)


CREATE TABLE #CLIENT_TABLE_2
  (CLIENTNUMBER INT,scNDCLIENTNUMBER varchar(10),REGION INT)

INSERT #CLIENT_TABLE_2
VALUES( 2,'14',1),(6,' ',2),(8,'15',2)

SELECT CASE
         WHEN b.CLIENTNUMBER IS NOT NULL
              AND len(b.scNDCLIENTNUMBER)>0  THEN b.scNDCLIENTNUMBER
         ELSE a.CLIENTNUMBER
       END Result
FROM   #CLIENT_TABLE_1 a
       LEFT JOIN #CLIENT_TABLE_2 b
              ON a.CLIENTNUMBER = b.CLIENTNUMBER 

输出:

+------+
|Result|
+------+
| 1    |
| 14   |
| 3    |
| 4    |
| 5    |
| 6    |
| 7    |
| 15   |
+------+

【讨论】:

  • 感谢您的建议!我真的必须在值之后输入实际值还是只输入列名?
  • 我只放入了 8 个示例行,但我的实际表中有数千行,因此将所有这些都输入是不可行的!
  • @crisu2 我没有得到你想说的。这只是一个例子。用原始表替换临时表并检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 2021-06-23
  • 2015-03-13
相关资源
最近更新 更多