左表中没有重复行的左连接

请看以下查询:

目录

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

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

查询

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

结果

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

10012来了两次... !

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

Tbl _ Content 中的一些行在 tbl _ Media 中有多于1个关联行。 我需要 tbl _ Content 中的所有行,即使 tbl _ Media BUT NO DUPLICATE RECORDS 中存在 Null 值。

299607 次浏览

试试 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

或者,您可以 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

OUTER APPLY选择与左表中的每一行匹配的单行(或无行)。

GROUP BY执行整个连接,然后折叠提供的列上的最终结果行。

可以通过使用 group by的通用 SQL 来实现这一点:

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;

或者使用相关的子查询:

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;

当然,limit 1的语法因数据库而异。可能是 top。或者 rownum = 1。或者 fetch first 1 rows。或者类似的东西。

使用 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

Tbl _ media 表的 content _ id 10012出现了两次,所以当 tbl _ content 与 tbl _ media 联接时,它将捕获10012两次,创建一行 media _ id = 1003,另一行 media _ id = 1000(所以如果同时考虑 content _ id 和 media _ id,信息实际上不会重复)。

问题变成,什么是内容10012(1000或1003)的正确优先级媒体?一旦确定了这种关系,就可以调整 ID tbl _ media 并连接表,而不必在 media _ id 级别创建重复内容。