Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 错误子查询在SQLServer2008中返回了多个值_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 错误子查询在SQLServer2008中返回了多个值

Sql server 错误子查询在SQLServer2008中返回了多个值,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我收到这个警告 Msg 512,级别16,状态1,第2行子查询返回的值超过1 价值当子查询在=、!=、=或者当子查询用作表达式时 这是我的问题 CREATE VIEW [dbo].[vwTrnLatihPerson2] AS SELECT A.MKPersonID, A.RegNo, A.NoFix, A.Nama, NIK= case When A.RegNo<>0 And A.NoFix=0

我收到这个警告

Msg 512,级别16,状态1,第2行子查询返回的值超过1 价值当子查询在=、!=、=或者当子查询用作表达式时

这是我的问题

CREATE VIEW [dbo].[vwTrnLatihPerson2]
AS
SELECT 
    A.MKPersonID,
    A.RegNo, 
    A.NoFix, 
    A.Nama, 
    NIK=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select NIK from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select NIK from vwMstBorongan Where FixNo=A.NoFix)
        End,
    Pendidikan=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select Pendidikan from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select Pendidikan from vwMstBorongan Where FixNo=A.NoFix)
        End,
    A.JabatanID,J.Jabatan,J.SubDeptID,D.SubDeptAbbr,D.SubDeptName,D.DivisiID,
    Divisi=(Select Divisi From tblMstDivisi Where DivisiID=D.DivisiID),
    NamaDivisi=(Select NamaDivisi From tblMstDivisi Where DivisiID=D.DivisiID),
    StatusTK=
        case 
            When A.RegNo<>0 And A.NoFix=0 then 'Karyawan'
            when A.NoFix<>0 And A.RegNo=0 then (Select Pekerjaan from vwMstBorongan Where FixNo=A.NoFix)
        End,
        A.TglMasuk,
        TglKeluar=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select TglKeluar from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select TglKeluar from vwMstBorongan Where FixNo=A.NoFix)
        End,
        A.NotActive
FROM         
    dbo.tblTrnLatihPerson A Left Outer Join
    dbo.tblMstJabatan J On J.JabatanID=A.JabatanID LEFT Outer Join
    dbo.tblMstSubDepartment D On D.SubDeptID=J.SubDeptID
--WHERE A.NotActive <> 1
GO
如果只需要一个结果,请使用SELECT TOP 1匹配该条件

 When A.RegNo<>0 And A.NoFix=0 then (Select TOP 1 NIK from vwMstKaryawan Where RegNo=A.Regno)

对其余的所有子查询都执行相同的操作。

子查询必须返回单个值,因此只需将top关键字与一行一起使用即可 您的代码将被删除

CREATE VIEW [dbo].[vwTrnLatihPerson2]
AS
SELECT 
    A.MKPersonID,
    A.RegNo, 
    A.NoFix, 
    A.Nama, 
    NIK=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select top 1 NIK from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select top 1 NIK from vwMstBorongan Where FixNo=A.NoFix)
        End,
    Pendidikan=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select top 1 Pendidikan from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select top 1 Pendidikan from vwMstBorongan Where FixNo=A.NoFix)
        End,
    A.JabatanID,J.Jabatan,J.SubDeptID,D.SubDeptAbbr,D.SubDeptName,D.DivisiID,
    Divisi=(Select top 1 Divisi From tblMstDivisi Where DivisiID=D.DivisiID),
    NamaDivisi=(Select top 1 NamaDivisi From tblMstDivisi Where DivisiID=D.DivisiID),
    StatusTK=
        case 
            When A.RegNo<>0 And A.NoFix=0 then 'Karyawan'
            when A.NoFix<>0 And A.RegNo=0 then (Select top 1 Pekerjaan from vwMstBorongan Where FixNo=A.NoFix)
        End,
        A.TglMasuk,
        TglKeluar=
        case 
            When A.RegNo<>0 And A.NoFix=0 then (Select top 1 TglKeluar from vwMstKaryawan Where RegNo=A.Regno)
            when A.NoFix<>0 And A.RegNo=0 then (Select top 1 TglKeluar from vwMstBorongan Where FixNo=A.NoFix)
        End,
        A.NotActive
FROM         
    dbo.tblTrnLatihPerson A Left Outer Join
    dbo.tblMstJabatan J On J.JabatanID=A.JabatanID LEFT Outer Join
    dbo.tblMstSubDepartment D On D.SubDeptID=J.SubDeptID
--WHERE A.NotActive <> 1
GO

下面是解决此错误的3种方法

您可以在每个子查询中添加TOP1,但不一定每次都能给出所需的结果

第二是你的观点的最佳观点。加入您的冗余表,但您不能给出top 1,所以请确保只有一个值返回该表,从而给出越来越多的where条件。在isnull条件下,如果数据类型为int或numeric,则可以更改0

CREATE VIEW [dbo].[vwTrnLatihPerson2]
AS
SELECT 
A.MKPersonID,
A.RegNo, 
A.NoFix, 
A.Nama, 
NIK=
    case 
        When A.RegNo<>0 And A.NoFix=0 then isnull( VMK.NIK , '') --(Select NIK from vwMstKaryawan Where RegNo=A.Regno)
        when A.NoFix<>0 And A.RegNo=0 then isnull( VMB.NIK , '') --(Select NIK from vwMstBorongan Where FixNo=A.NoFix)
    End,
Pendidikan=
    case 
        When A.RegNo<>0 And A.NoFix=0 then isnull( VMK.Pendidikan , '') --(Select Pendidikan from vwMstKaryawan Where RegNo=A.Regno)
        when A.NoFix<>0 And A.RegNo=0 then isnull( VMB.Pendidikan , '') --(Select Pendidikan from vwMstBorongan Where FixNo=A.NoFix)
    End,
A.JabatanID,J.Jabatan,J.SubDeptID,D.SubDeptAbbr,D.SubDeptName,D.DivisiID,
Divisi=isnull( MD.Divisi , '')--(Select Divisi From tblMstDivisi Where DivisiID=D.DivisiID),
NamaDivisi=isnull( MD.NamaDivisi , '')--(Select NamaDivisi From tblMstDivisi Where DivisiID=D.DivisiID),
StatusTK=
    case 
        When A.RegNo<>0 And A.NoFix=0 then 'Karyawan'
        when A.NoFix<>0 And A.RegNo=0 then isnull( VMB.Pekerjaan , '') --(Select Pekerjaan from vwMstBorongan Where FixNo=A.NoFix)
    End,
    A.TglMasuk,
    TglKeluar=
    case 
        When A.RegNo<>0 And A.NoFix=0 then isnull( VMK.TglKeluar , '') --(Select TglKeluar from vwMstKaryawan Where RegNo=A.Regno)
        when A.NoFix<>0 And A.RegNo=0 then isnull( VMB.TglKeluar , '') --(Select TglKeluar from vwMstBorongan Where FixNo=A.NoFix)
    End,
    A.NotActive
FROM         
dbo.tblTrnLatihPerson A 
Left Outer Join dbo.tblMstJabatan J On J.JabatanID=A.JabatanID 
LEFT Outer Join dbo.tblMstSubDepartment D On D.SubDeptID=J.SubDeptID
--this 2 table added with left outer join AND NOTE IT SEEMS MULTIPLE VALUE YOU WILL GET THEN YOU HAVE TO ADD OTHER CONDITION TO JOIN
LEFT OUTER JOIN DBO.vwMstKaryawan VMK ON  VMK.RegNo=A.Regno
LEFT OUTER JOIN DBO.vwMstBorongan VMB ON  VMB.FixNo=A.NoFix
LEFT OUTER JOIN DBO.tblMstDivisi MD ON MD.DivisiID=D.DivisiID

--WHERE A.NotActive <> 1
GO
使用的cte

CREATE VIEW [dbo].[vwTrnLatihPerson2]
AS
; with cte as 
(
    --GIVE ALIAS NAME TO DIFFERENTIATE THE SAME COLUMN NAME
    SELECT TOP 1 A.RegNo, A.NoFix, VMK.NIK AS ANIK, VMB.NIK AS BNIK, VMK.Pendidikan APEND, VMB.Pendidikan BPEND, --VMK.Pekerjaan, 
        VMB.Pekerjaan BPEK, VMK.TglKeluar ATGL, VMB.TglKeluar BTGL
    FROM 
    dbo.tblTrnLatihPerson A 
    Left Outer Join vwMstKaryawan VMK ON RegNo=A.Regno  --give other condition if you want WITH ORDER BY 
    Left Outer Join vwMstBorongan VMB ON FixNo=A.NoFix --give other condition if you want WITH ORDER BY 
    ),
    cte1 as
    (
    select top 1 A.Regno, D.NamaDivisi, D.Divisi from
    dbo.tblTrnLatihPerson A 
    LEFT Outer Join dbo.tblMstDivisi D On A.DivisiID=D.DivisiID --give other condition if you want WITH ORDER BY 
    )

    SELECT 
        A.MKPersonID,
        A.RegNo, 
        A.NoFix, 
        A.Nama, 
        NIK=
            case 
                When A.RegNo<>0 And A.NoFix=0 then CTE.ANIK --(Select NIK from vwMstKaryawan Where RegNo=A.Regno)
                when A.NoFix<>0 And A.RegNo=0 then CTE.BNIK --(Select NIK from vwMstBorongan Where FixNo=A.NoFix)
            End,
        Pendidikan=
            case 
                When A.RegNo<>0 And A.NoFix=0 then CTE.APEND --(Select Pendidikan from vwMstKaryawan Where RegNo=A.Regno)
                when A.NoFix<>0 And A.RegNo=0 then CTE.BPEND --(Select Pendidikan from vwMstBorongan Where FixNo=A.NoFix)
            End,
        A.JabatanID,J.Jabatan,J.SubDeptID,D.SubDeptAbbr,D.SubDeptName,D.DivisiID,
        Divisi=CTE1.Divisi-(Select Divisi From tblMstDivisi Where DivisiID=D.DivisiID),
        NamaDivisi= CTE1.NamaDivisi--(Select NamaDivisi From tblMstDivisi Where DivisiID=D.DivisiID),
        StatusTK=
            case 
                When A.RegNo<>0 And A.NoFix=0 then 'Karyawan'
                when A.NoFix<>0 And A.RegNo=0 then CTE.BPEK --(Select Pekerjaan from vwMstBorongan Where FixNo=A.NoFix)
            End,
            A.TglMasuk,
            TglKeluar=
            case 
                When A.RegNo<>0 And A.NoFix=0 then CTE.ATGL --(Select TglKeluar from vwMstKaryawan Where RegNo=A.Regno)
                when A.NoFix<>0 And A.RegNo=0 then CTE.BTGL --(Select TglKeluar from vwMstBorongan Where FixNo=A.NoFix)
            End,
            A.NotActive
    FROM         
        dbo.tblTrnLatihPerson A 
        Left Outer Join dbo.tblMstJabatan J On J.JabatanID=A.JabatanID 
        LEFT Outer Join dbo.tblMstSubDepartment D On D.SubDeptID=J.SubDeptID
        LEFT Outer Join cte On cte.RegNo=A.Regno
        LEFT Outer Join cte1 On cte1.Regno=A.Regno
    --WHERE A.NotActive <> 1
    GO

正如消息所说,其中一个子查询返回的行不止一行。您需要重新查看查询和数据,以检查子查询中是否遗漏了任何附加条件。一种快速确定子查询的方法是将TOP1添加到select语句,然后重新执行查询