首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Join返回重复条目

SQL Join返回重复条目
EN

Stack Overflow用户
提问于 2017-07-07 02:28:28
回答 1查看 36关注 0票数 2

首先我要说的是,我是SQL的新手,我写的东西是基于教程的(我也在使用SQL Server 2012)。我遇到的问题是,我试图从4个不同的表中获取数据,并将它们放入1个表中,以供Access访问。然而,如果一个值与其他值不同,我会不断得到重复的结果。这些表看起来像

Cell1

代码语言:javascript
运行
复制
|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

Cell2

代码语言:javascript
运行
复制
|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

Cell3

代码语言:javascript
运行
复制
|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

Cell4

代码语言:javascript
运行
复制
|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       0|

我的代码是

代码语言:javascript
运行
复制
Alter Procedure [dbo].[spSingleData](
@LotNum varchar(50)
)
AS
Truncate Table dbo.SingleSheet
Begin
Insert INTO dbo.SingleSheet (SerialNum, Cell1PF, Cell2Pf, Cell3PF, Cell4PF)
Select Distinct Cell1.SerialNum, Cell1.PF, Cell2.PF, Cell3.PF, Cell4.PF
From dbo.Cell1
Left Join Cell2 On Cell1.LotNum=Cell2.LotNum
Left Join Cell3 On Cell1.LotNum=Cell3.LotNum
Left Join Cell4 On Cell1.LotNum=Cell4.LotNum
Where Cell1.LotNum = @LotNum
Order by SerialNum
End

PassFail可以是0、1或NULL,但是,与上面的示例一样,如果其中一个PassFails与其余的不同,则结果表将返回

代码语言:javascript
运行
复制
|1234|   1|   1|   1|    0|
|1234|   1|   1|   1|    1|
|2345|   1|   1|   1|    0|
|2345|   1|   1|   1|    1|
|3456|   1|   1|   1|    0|
|3456|   1|   1|   1|    1|
|4567|   1|   1|   1|    0|
|4567|   1|   1|   1|    1|

我只是使用了错误的连接,还是应该使用其他连接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 02:42:06

这就是你想要实现的目标吗:

如果是这样,则在SerialNum上缺少JOIN谓词,并且不需要DISTINCT

示例数据:

代码语言:javascript
运行
复制
IF OBJECT_ID('tempdb..#Cell1') IS NOT NULL
DROP TABLE #Cell1
CREATE TABLE #Cell1 (LotNum varchar(10),SerialNum int,PassFail bit)
INSERT INTO #Cell1
VALUES
('Lot11',1234,1),
('Lot11',2345,1),
('Lot11',3456,1),
('Lot11',4567,1)

IF OBJECT_ID('tempdb..#Cell2') IS NOT NULL
DROP TABLE #Cell2
CREATE TABLE #Cell2 (LotNum varchar(10),SerialNum int,PassFail bit)
INSERT INTO #Cell2
VALUES
('Lot11',1234,1),
('Lot11',2345,1),
('Lot11',3456,1),
('Lot11',4567,1)

IF OBJECT_ID('tempdb..#Cell3') IS NOT NULL
DROP TABLE #Cell3
CREATE TABLE #Cell3 (LotNum varchar(10),SerialNum int,PassFail bit)
INSERT INTO #Cell3
VALUES
('Lot11',1234,1),
('Lot11',2345,1),
('Lot11',3456,1),
('Lot11',4567,1)

IF OBJECT_ID('tempdb..#Cell4') IS NOT NULL
DROP TABLE #Cell4
CREATE TABLE #Cell4 (LotNum varchar(10),SerialNum int,PassFail bit)
INSERT INTO #Cell4
VALUES
('Lot11',1234,1),
('Lot11',2345,1),
('Lot11',3456,1),
('Lot11',4567,0)

查询:

代码语言:javascript
运行
复制
SELECT #Cell1.SerialNum,
       #Cell1.PassFail,
       #Cell2.PassFail,
       #Cell3.PassFail,
       #Cell4.PassFail
FROM #Cell1
     LEFT JOIN #Cell2 ON #Cell1.LotNum = #Cell2.LotNum AND #Cell1.SerialNum = #Cell2.SerialNum
     LEFT JOIN #Cell3 ON #Cell1.LotNum = #Cell3.LotNum AND #Cell1.SerialNum = #Cell3.SerialNum
     LEFT JOIN #Cell4 ON #Cell1.LotNum = #Cell4.LotNum AND #Cell1.SerialNum = #Cell4.SerialNum
ORDER BY SerialNum;

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44956420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档