SQL Join返回重复的条目

时间:2017-07-06 18:28:28

标签: sql join

刚开始说我是SQL的新手,我写的内容是基于教程(我也在使用SQL Server 2012)。我遇到的问题是我试图从4个不同的表中获取数据并将它们放入1个表中以供Access访问。但是,如果值与其他值不同,我会继续获得重复结果。 表格看起来像

小区1

|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

小区2

|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

小区3

|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       1|

小区4

|LotNum|SerialNum|PassFail|
| Lot11|     1234|       1|
| Lot11|     2345|       1|
| Lot11|     3456|       1|
| Lot11|     4567|       0|

我的代码是

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与其余的不同,则返回结果表

|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|

我只是使用了错误的加入,还是应该使用别的东西?

1 个答案:

答案 0 :(得分:1)

这是你想要实现的目标:

如果是,那么您错过了JOIN上的SerialNum谓词,而您不需要DISTINCT

示例数据:

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)

查询:

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;

结果:

enter image description here