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

Posted

技术标签:

【中文标题】如何在sql中交叉连接两个表【英文标题】:How to cross join two tables in sql 【发布时间】:2021-05-19 13:55:31 【问题描述】:

所以我需要交叉连接 2 个表,但是如果没有收到错误,我找不到这样做的方法

ORA-01427:单行子查询返回多于一行 ORA-06512:在“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;

【问题讨论】:

也许第二个子查询返回不止一行。您确定 where 子句中的给定条件只有一个 Expire_Date 吗? 【参考方案1】:

(选择 到期日期 从 SAP_Data 其中 Personnel_Number = _ESA.Personnel_Number AND Duplicate1 = '有效' AND Course_Num = Safety_Map.Course_Num)

返回多行。如果您只需要前一个,那么您可以使用 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;

或者您可以使用聚合(max() 或 min()):

(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

【讨论】:

非常感谢您的工作!就像我说的我是 sql 新手甚至不知道 max 是一个东西我不是一个数据库编码器 不客气。你在 sql 中做得很好。最良好的祝愿。【参考方案2】:

嗯,看起来像是 Expire_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;

【讨论】:

以上是关于如何在sql中交叉连接两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何优化SQL语句

详解SQL Server连接(内连接外连接交叉连接)

SQL的连接(外连接内连接交叉连接和自连接)

如何写出高性能的sql语句?

如何在 HIVE hql 中添加两个计数?

MSSQL 详解SQL Server连接(内连接外连接交叉连接)