sql - 多重内连接 - SQL

标签 sql sql-server

我有这个 SQL 请求,但不起作用...我真的不知道为什么,因为我从 SQL 开始...

Select CDR.*,
  p1.*,
  p2.*,
  p3.*
From dbo.T_CDR_APPEL CDR
  Inner Join dbo.POS As p1 On CDR.CDR_LOC_CODE = p1.Loc_Code And
    CDR.CDR_LOC_CODE Like 'SC%VI%' And CDR.CDR_TYPE Like 'I%'
  Inner Join dbo.POS As p2 On CDR.CDR_LAST_REDIR_NO = p2.Post_type And
    CDR.CDR_LOC_CODE Like 'CCN%' And CDR.CDR_TYPE Like 'I'
  Inner Join dbo.POS As p3 On CDR.CDR_LAST_REDIR_NO = p3.Backup_Number And
    CDR.CDR_LOC_CODE Like 'VoiceMail%' And CDR.CDR_TYPE Like 'IF'

感谢您的帮助

最佳答案

您的选择语句

Select CDR.*,
  p1.*,
  p2.*,
  p3.*
From dbo.T_CDR_APPEL CDR
  Inner Join dbo.POS As p1 On CDR.CDR_LOC_CODE = p1.Loc_Code And
    CDR.CDR_LOC_CODE Like 'SC%VI%' And CDR.CDR_TYPE Like 'I%'
  Inner Join dbo.POS As p2 On CDR.CDR_LAST_REDIR_NO = p2.Post_type And
    CDR.CDR_LOC_CODE Like 'CCN%' And CDR.CDR_TYPE Like 'I'
  Inner Join dbo.POS As p3 On CDR.CDR_LAST_REDIR_NO = p3.Backup_Number And
    CDR.CDR_LOC_CODE Like 'VoiceMail%' And CDR.CDR_TYPE Like 'IF'

基本相同

SELECT CDR.*,
  p1.*,
  p2.*,
  p3.*
FROM dbo.T_CDR_APPEL CDR
  INNER JOIN dbo.POS AS p1 ON CDR.CDR_LOC_CODE = p1.Loc_Code
  INNER JOIN dbo.POS AS p2 ON CDR.CDR_LAST_REDIR_NO = p2.Post_type
  INNER JOIN dbo.POS AS p3 ON CDR.CDR_LAST_REDIR_NO = p3.Backup_Number
WHERE
    CDR.CDR_LOC_CODE LIKE 'SC%VI%' AND     
    CDR.CDR_LOC_CODE LIKE 'CCN%' AND 
    CDR.CDR_LOC_CODE LIKE 'VoiceMail%' AND 
    CDR.CDR_TYPE LIKE 'I%' AND 
    CDR.CDR_TYPE LIKE 'I' AND 
    CDR.CDR_TYPE LIKE 'IF'

因此,问题在于 WHERE 子句对同一列 CDR.CDR_LOC_CODECDR 具有许多 AND 条件组合.CDR_TYPE。尝试将 AND 替换为 OR

更新: 由于 p1,p2,p3 属于同一个表,为避免重复列,请尝试此

SELECT CDR.*, p.* FROM 
(
   SELECT *, 
   (CASE 
        WHEN CDR_TYPE LIKE 'I%' THEN CDR_LOC_CODE
        WHEN CDR_TYPE LIKE 'I' THEN CDR_LAST_REDIR_NO
        WHEN CDR_TYPE LIKE 'IF' THEN CDR_LAST_REDIR_NO
        ELSE ''
    END) TMP_COL FROM dbo.T_CDR_APPEL 
) CDR
INNER JOIN dbo.POS p ON
   (CASE 
        WHEN CDR.CDR_TYPE LIKE 'I%' THEN p.Loc_Code
        WHEN CDR.CDR_TYPE LIKE 'I' THEN p.Post_type
        WHEN CDR.CDR_TYPE LIKE 'IF' THEN p.Backup_Number
        ELSE ''
    END) = CDR.TMP_COL
WHERE
   (CDR.CDR_LOC_CODE LIKE 'SC%VI%' AND CDR.CDR_TYPE LIKE 'I%') OR
   (CDR.CDR_LOC_CODE LIKE 'CCN%' AND CDR.CDR_TYPE LIKE 'I') OR
   (CDR.CDR_LOC_CODE LIKE 'VoiceMail%' AND CDR.CDR_TYPE LIKE 'IF')

注意:对于大型表,运行上面的查询可能需要一段时间。您可能需要向 WHERE 子句添加一些条件以进行进一步调整。另外,我们应该将 WHERE 子句放入子查询中,因为 CDR_LOC_CODECDR_TYPE 属于同一个表 dbo.T_CDR_APPEL。另请检查动态列 TMP_COL 为 Null 或为空,以避免连接表 ON '' = ''ON NULL = NULL

SELECT CDR.*, p.* FROM 
(
   SELECT *, 
   (CASE 
        WHEN CDR_TYPE LIKE 'I%' THEN CDR_LOC_CODE
        WHEN CDR_TYPE LIKE 'I' THEN CDR_LAST_REDIR_NO
        WHEN CDR_TYPE LIKE 'IF' THEN CDR_LAST_REDIR_NO
        ELSE ''
    END) TMP_COL FROM dbo.T_CDR_APPEL 
    WHERE
       (CDR_LOC_CODE LIKE 'SC%VI%' AND CDR_TYPE LIKE 'I%') OR
       (CDR_LOC_CODE LIKE 'CCN%' AND CDR_TYPE LIKE 'I') OR
       (CDR_LOC_CODE LIKE 'VoiceMail%' AND CDR_TYPE LIKE 'IF')
) CDR
INNER JOIN dbo.POS p ON
   (CASE 
        WHEN CDR.CDR_TYPE LIKE 'I%' THEN p.Loc_Code
        WHEN CDR.CDR_TYPE LIKE 'I' THEN p.Post_type
        WHEN CDR.CDR_TYPE LIKE 'IF' THEN p.Backup_Number
        ELSE ''
    END) = CDR.TMP_COL AND NULLIF(CDR.TMP_COL, '') IS NOT NULL

关于sql - 多重内连接 - SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272890/

相关文章:

c# - LINQ to SQL - 调用内置聚合函数(即 STDEV)

sql - 如何定义附加查询 Microsoft Access 的目标

sql - 解决连续性的日期范围(GAPS AND ISLANDS)

sql - 带条件条件的 Where 子句

MYSQL - 理解这个 SELECT 和 UNION ALL 查询

使用交集除外或并集关系代数的 SQL Server 查询

php - 如何查询介于两个日期之间的数据?

sql-server - 自动将 GRANT EXECUTE 添加到 MSSQL Management Studio 中的 Drop&Create 脚本

sql - TSQL DateDiff 返回带 2 位小数的天数

sql-server - SQL存储过程和错误处理