如何在sql中交叉连接两个表

如何在sql中交叉连接两个表,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,因此,我需要交叉连接两个表,但我无法找到一种不接收错误的方法 ORA-01427:单行子查询返回多行ORA-06512:at SYS.DBMS_SQL,第1721行 以下是我正在使用的代码,但我不知道错误来自何处,我是sql新手,因此非常感谢您的帮助: INSERT INTO Valid_Safety (Area, Course_ID, Course_Name, Personnel_Number, ESA_Name, Section_Leader, Valid, Expire_Date) Se

因此,我需要交叉连接两个表,但我无法找到一种不接收错误的方法

ORA-01427:单行子查询返回多行ORA-06512:at SYS.DBMS_SQL,第1721行

以下是我正在使用的代码,但我不知道错误来自何处,我是sql新手,因此非常感谢您的帮助:

INSERT INTO Valid_Safety (Area, Course_ID, Course_Name, Personnel_Number, ESA_Name, Section_Leader, Valid, Expire_Date)

Select Safety_Map.Area,
       Course_ID,
       Course_Name,
       _ESA.Personnel_Number,
       _ESA.ESA_Name,
       _ESA.Section_Leader,
    (Select
    COUNT(*) Valid
     From
    SAP_Data
    Where Personnel_Number = TX3_ESA.Personnel_Number
    AND Duplicate1 = 'Valid'
    AND Course_Num = Safety_Map.Course_Num) As Valid,
    
     (Select 
     Expire_Date
     From 
      SAP_Data
    Where Personnel_Number = _ESA.Personnel_Number
    AND Duplicate1 = 'Valid'
    AND Course_Num = Safety_Map.Course_Num) As Expire_Date
   
From Safety_Map CROSS JOIN _ESA;

看起来像是Expire\u Date的子查询,返回多行:

因此,根据逻辑,解决方案可能会有所不同,但这里有一种方法:

...
    (
        Select max(Expire_Date)
        From SAP_Data
        Where Personnel_Number = _ESA.Personnel_Number
        AND Duplicate1 = 'Valid'
        AND Course_Num = Safety_Map.Course_Num
    ) As Expire_Date
From Safety_Map CROSS JOIN _ESA;
挑选 到期日 从…起 SAP_数据 其中人员编号=\ ESA.人员编号 和Duplicate1='Valid' 课程号=安全地图。课程号

正在返回多行。如果您只需要最上面的一行,那么您可以使用rownum或仅获取前10行

Select Safety_Map.Area,
       Course_ID,
       Course_Name,
       _ESA.Personnel_Number,
       _ESA.ESA_Name,
       _ESA.Section_Leader,
    (Select
    COUNT(*) Valid
     From
    SAP_Data
    Where Personnel_Number = TX3_ESA.Personnel_Number
    AND Duplicate1 = 'Valid'
    AND Course_Num = Safety_Map.Course_Num) As Valid,
    
     (Select 
     Expire_Date
     From 
      SAP_Data
    Where Personnel_Number = _ESA.Personnel_Number
    AND Duplicate1 = 'Valid'
    AND Course_Num = Safety_Map.Course_Num
    and rownum=1 ) As Expire_Date
   
From Safety_Map CROSS JOIN _ESA;
也可以使用聚合最大值或最小值:

(Select 
     max(Expire_Date)
     From 
      SAP_Data
    Where Personnel_Number = _ESA.Personnel_Number
    AND Duplicate1 = 'Valid'
    AND Course_Num = Safety_Map.Course_Num
    and rownum=1 ) As Expire_Date

第二个子查询可能返回多行。您确定where子句中给定的条件只有一个过期日期吗?非常感谢您的帮助!就像我说的,我是sql新手,甚至不知道max是个东西,我不是一个数据库编码员,非常欢迎你。您在sql方面做得很好。最美好的祝福。