SQL内部联接和分区以在匹配时获取行号
我有两张桌子。第一个表“a”是第二个表“b”。 我正在编写一个查询,该查询获取表a中的每一行,其中定义了33行,并且内部连接表b,其中encallocation或BackPanLoc与表a中的工作单元匹配 我只想要表B中的一行,它们基于BackPan和EnclLocation进行匹配,但它们不是相同的记录。表b有几行数据被分配给与表a相同的工作单元。我只是试图检索这些额外的行并对其进行分区 I附表a和表b。我还附上了关于Workcell 10的此查询所需的结果,仅作为示例。。。如您所见,表B有4条记录,它们要么是EnclLocation,要么是BackPanLoc=10。但我的结果只显示了相同的DelvNumber 4次。非常感谢您的帮助 表a 表b 错误结果 所需结果仅以工作单元10为例SQL内部联接和分区以在匹配时获取行号,sql,sql-server,sql-server-2008,join,Sql,Sql Server,Sql Server 2008,Join,我有两张桌子。第一个表“a”是第二个表“b”。 我正在编写一个查询,该查询获取表a中的每一行,其中定义了33行,并且内部连接表b,其中encallocation或BackPanLoc与表a中的工作单元匹配 我只想要表B中的一行,它们基于BackPan和EnclLocation进行匹配,但它们不是相同的记录。表b有几行数据被分配给与表a相同的工作单元。我只是试图检索这些额外的行并对其进行分区 I附表a和表b。我还附上了关于Workcell 10的此查询所需的结果,仅作为示例。。。如您所见,表B有4
workcell DelvNumber RowNum
1 447910-02 1
2 445710-01 1
2 445710-01 2
3 444291-01 1
3 444291-01 2
4 447910-03 1
4 447910-03 2
5 648020-01 1
6 647800-02 1
7 646920-01 1
7 646920-01 2
8 644830-4-8 1
8 644830-4-8 2
9 443990-01 1
10 645960-01-03 1
10 445710-11 2
10 445710-02 3
10 445710-09 4
使用的代码
WITH ss
AS (SELECT a.*,
Row_number()
OVER(
partition BY a.workcell
ORDER BY a.workcell) AS rownum
FROM nwcurrent a
INNER JOIN nwdeliverables b
ON b.encllocation = a.workcell
OR b.backpanloc = a.workcell
WHERE ( b.status < 9
AND ( b.encllocation <> 0
OR b.backpanloc <> 0 )
OR a.delvnumber = '123' ))
SELECT *
FROM ss
复制粘贴格式
1447910-02 1
2 445710-01 1
2 445710-01 2
3 444291-01 1
3 444291-01 2
4 447910-03 1
4 447910-03 2
5 648020-01 1
6 647800-02 1
7 646920-01 1
7 646920-01 2
8 644830-4-8 1
8 644830-4-8 2
9 443990-01 1
10 645960-01-03 1
10 445710-11 2
10 445710-02 3
10 445710-09 4
SQLFiddle
新的尝试
SELECT a.workcell
,a.DelvNumber AS A_DelvNumber
,b.DelvNumber AS B_DelvNumber
,CASE WHEN a.DelvNumber<>b.DelvNumber THEN b.DelvNumber ELSE a.DelvNumber END AS DelvNumber_Resolved
,Row_number() OVER(partition BY a.workcell ORDER BY a.workcell) AS rownum
FROM NWCurrent a
INNER JOIN NWDeliverables AS b ON b.EnclLocation=a.WorkCell OR b.BackPanLoc=a.WorkCell
WHERE (b.status <9 AND (b.EnclLocation<>0 OR b.BackPanLoc<>0)OR a.DelvNumber='123')
如果只查找RowNum大于1的对象,则可以使用SELECT tbl.*FROM SELECT WHERE tbl.RowNum>1从ss中查找SELECT*。但可能没那么简单。。我不理解期望的结果:10有什么错?8没有什么错?我只是用10作为我试图返回的示例。我在10的期望结果中有4个不同的行,但是我不正确的表格显示了4个相同的行。我需要显示所有行号,而不仅仅是行数>1OK,我明白了。。。10的结果没有错误,因为第15行中有例如445710-09。但你想看看其他的参考资料。请以可粘贴的格式提供您的样本数据好吗?不确定这是否是您所说的内容不,我想要445710。。。。。这是我想要的结果。。。。。看看我的错误结果表。我有4行相同的工作单元10。。。。我的工作单元10有4个不同的行。我需要这4个不同的行:在您想要的结果中,您不希望看到只有一个外观(如6)的工作单元,您不希望看到具有许多外观的工作单元,只要它们的DelvNumber相等。您只想看到WorkCell 10,因为它有多行,但DelvNumber不同。制作SQLFIDLE以帮助更好地解释。。。几乎doneWorkcell 10在结果中出现4次。。。。但是所有4行的delvnumber都是相同的。。。。这是不正确的。表b有3行,其中enclocation或backpanloc=a.workcell。。。。我还想要那3个不同的DelvNumber。我想要全部4行,或3行,或2或1。。。如果有多行具有不同的DelvNumber,但分配给同一个工作单元。。。我想要它。。。这有帮助吗?@ENGR024,有什么逻辑可以决定,什么时候取一个数字,什么时候取另一个?