Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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联接返回重复的条目_Sql_Join - Fatal编程技术网

SQL联接返回重复的条目

SQL联接返回重复的条目,sql,join,Sql,Join,首先我要说的是,我是SQL新手,我所写的都是基于教程(我也在使用SQL Server 2012)。我遇到的问题是,我试图从4个不同的表中获取数据,并将它们放入1个表中,以便Access访问。但是,如果某个值与其他值不同,我会不断得到重复的结果。 这些桌子看起来像 第1单元 细胞2 第三单元 第四单元 我的代码是 Alter Procedure [dbo].[spSingleData]( @LotNum varchar(50) ) AS Truncate Table dbo.SingleSheet

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

第1单元

细胞2

第三单元

第四单元

我的代码是

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,但是,就像上面的示例一样,如果其中一个PassFail与其余的不同,则结果表返回

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

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

这就是您试图实现的目标:

如果是这样,则在
SerialNum
上缺少
JOIN
谓词,并且不需要
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;
结果:

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