左连接没有左表的重复行

uro*_*org 43 sql join duplicates

请查看以下查询:

tbl_Contents

Content_Id  Content_Title    Content_Text
10002   New case Study   New case Study
10003   New case Study   New case Study
10004   New case Study   New case Study
10005   New case Study   New case Study
10006   New case Study   New case Study
10007   New case Study   New case Study
10008   New case Study   New case Study
10009   New case Study   New case Study
10010   SEO News Title   SEO News Text
10011   SEO News Title   SEO News Text
10012   Publish Contents SEO News Text
Run Code Online (Sandbox Code Playgroud)

tbl_Media

Media_Id    Media_Title  Content_Id
1000    New case Study   10012
1001    SEO News Title   10010
1002    SEO News Title   10011
1003    Publish Contents 10012
Run Code Online (Sandbox Code Playgroud)

QUERY

SELECT 
C.Content_ID,
C.Content_Title,
M.Media_Id

FROM tbl_Contents C
LEFT JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
ORDER BY C.Content_DatePublished ASC
Run Code Online (Sandbox Code Playgroud)

结果

10002   New case Study  2014-03-31 13:39:29.280 NULL
10003   New case Study  2014-03-31 14:23:06.727 NULL
10004   New case Study  2014-03-31 14:25:53.143 NULL
10005   New case Study  2014-03-31 14:26:06.993 NULL
10006   New case Study  2014-03-31 14:30:18.153 NULL
10007   New case Study  2014-03-31 14:30:42.513 NULL
10008   New case Study  2014-03-31 14:31:56.830 NULL
10009   New case Study  2014-03-31 14:35:18.040 NULL
10010   SEO News Title  2014-03-31 15:22:15.983 1001
10011   SEO News Title  2014-03-31 15:22:30.333 1002
10012   Publish         2014-03-31 15:25:11.753 1000
10012   Publish         2014-03-31 15:25:11.753 1003
Run Code Online (Sandbox Code Playgroud)

10012将来两次......!

我的查询是从tbl_Contents返回重复的行(连接中的左表)

tbl_Contents中的某些行在tbl_Media中具有多个关联的行.我需要来自tbl_Contents的所有行,即使tbl_Media中存在Null值但是没有DUPLICATE RECORDS.

eou*_*3hf 56

试试吧 OUTER APPLY

SELECT 
    C.Content_ID,
    C.Content_Title,
    C.Content_DatePublished,
    M.Media_Id
FROM 
    tbl_Contents C
    OUTER APPLY
    (
        SELECT TOP 1 *
        FROM tbl_Media M 
        WHERE M.Content_Id = C.Content_Id 
    ) m
ORDER BY 
    C.Content_DatePublished ASC
Run Code Online (Sandbox Code Playgroud)

或者,你可以GROUP BY得到结果

SELECT 
    C.Content_ID,
    C.Content_Title,
    C.Content_DatePublished,
    M.Media_Id
FROM 
    tbl_Contents C
    LEFT OUTER JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
GROUP BY
    C.Content_ID,
    C.Content_Title,
    C.Content_DatePublished,
    M.Media_Id
ORDER BY
    C.Content_DatePublished ASC
Run Code Online (Sandbox Code Playgroud)

OUTER APPLY从左表中的每一行相匹配选择单个行(或无).

GROUP BY执行整个加盟,但随后崩溃所提供的列中的最终结果行.

  • 值得注意的是,cross apply不是标准的sql.例如,在postgres中不存在 (6认同)
  • 如果与 SUM 或 COUNT 等聚合函数结合使用,在这种情况下使用 GROUP BY 将导致行被重复计算 (2认同)
  • 我认为您忘记为 M.Media_Id 选择添加聚合函数。该列不会自行折叠。在这种形式中,查询应该给出错误恕我直言。 (2认同)

Gor*_*off 16

您可以使用通用SQL执行此操作group by:

SELECT C.Content_ID, C.Content_Title, MAX(M.Media_Id)
FROM tbl_Contents C LEFT JOIN
     tbl_Media M
     ON M.Content_Id = C.Content_Id 
GROUP BY C.Content_ID, C.Content_Title
ORDER BY MAX(C.Content_DatePublished) ASC;
Run Code Online (Sandbox Code Playgroud)

或者使用相关子查询:

SELECT C.Content_ID, C.Contt_Title,
       (SELECT M.Media_Id
        FROM tbl_Media M
        WHERE M.Content_Id = C.Content_Id
        ORDER BY M.MEDIA_ID DESC
        LIMIT 1
       ) as Media_Id
FROM tbl_Contents C 
ORDER BY C.Content_DatePublished ASC;
Run Code Online (Sandbox Code Playgroud)

当然,limit 1数据库之间的语法也各不相同.可能是top.或者rownum = 1.或者fetch first 1 rows.或类似的东西.


小智 5

使用 DISTINCT 标志将删除重复的行。

SELECT DISTINCT
C.Content_ID,
C.Content_Title,
M.Media_Id

FROM tbl_Contents C
LEFT JOIN tbl_Media M ON M.Content_Id = C.Content_Id 
ORDER BY C.Content_DatePublished ASC
Run Code Online (Sandbox Code Playgroud)

  • 将 `DISTINCT` 添加到查询可能会非常低效(在超过 5000 行的 postgress 中,我看到查询时间增加了 10 倍) (7认同)