1

请参阅http://sqlfiddle.com/#!3/2506f/2/0

我有两张桌子。一个是一般记录,另一个是包含链接到该记录的相关文档的表格。

在我的示例中,我创建了一个简单的查询,它显示了所有记录及其相关文档。这很好,但我想要一个更复杂的情况。

在“mainrecord”表中有一个“multiple”字段。如果这是 0,那么我只想要文档表中的最新文档(即具有最高 ID)。如果是 1,我想加入所有链接的文档。

所以,而不是查询的结果是这样的: -

ID  NAME    MULTIPLE    DOCUMENTNAME    IDLINK
1   One     1           first document    1
1   One     1           second document   1
2   Two     0           third document    2
2   Two     0           fourth document   2
3   Three   1           fifth document    3
3   Three   1           sixth document    3

它应该看起来像这样:-

ID  NAME    MULTIPLE    DOCUMENTNAME    IDLINK
1   One     1           first document    1
1   One     1           second document   1
2   Two     0           fourth document   2
3   Three   1           fifth document    3
3   Three   1           sixth document    3

有没有办法将此条件包含在我的查询中以获得我想要的结果。如果需要,我很乐意进一步解释。

提前致谢。

4

5 回答 5

2
WITH myData
AS
(SELECT mainrecord.*, documentlinks.documentName, documentlinks.idlink,
Row_number()
                  OVER (
                    partition BY mainrecord.ID
                    ORDER BY mainrecord.ID ASC) AS ROWNUM
FROM mainrecord INNER JOIN documentlinks
ON mainrecord.id = documentlinks.idlink)
SELECT *
FROM mydata o
WHERE multiple = 0 AND rownum =
(SELECT max(rownum) FROM mydata i WHERE i.id = o.id)
UNION
SELECT *
FROM myData
WHERE multiple = 1

http://sqlfiddle.com/#!3/2506f/57

于 2012-11-02T11:23:23.943 回答
2

另一个解决方案(在SQL-Fiddle测试):

SELECT m.*, 
       d.id as did, d.documentName, d.IDLink
FROM mainrecord AS m
  JOIN documentlinks AS d
    ON  d.IDLink = m.id 
    AND m.multiple = 1 

UNION ALL

SELECT m.*, 
       d.id as did, d.documentName, d.IDLink
FROM mainrecord AS m
  JOIN
    ( SELECT d.IDLink
           , MAX(d.id) AS did
      FROM mainrecord AS m
        JOIN documentlinks AS d
          ON  d.IDLink = m.id 
          AND m.multiple = 0
      GROUP BY d.IDLink
    ) AS g
    ON g.IDLink = m.id 
  JOIN documentlinks AS d
    ON  d.id = g.did

ORDER BY id, did ;
于 2012-11-02T11:26:08.343 回答
1

这可能会:

SELECT mainrecord.name, documentlinks.documentname
FROM documentlinks
INNER JOIN mainrecord ON mainrecord.id = documentlinks.IDLink AND multiple = 1

UNION

SELECT mainrecord.name, documentlinks.documentname
FROM (SELECT max(id) id, IDLink FROM documentlinks group by IDLink) maxdocuments
INNER JOIN documentlinks ON documentlinks.id = maxdocuments.id
INNER JOIN mainrecord ON mainrecord.id = documentlinks.IDLink AND multiple = 0
于 2012-11-02T11:24:12.047 回答
0

SQL 小提琴

select
    m.ID, m.name, m.multiple, dl.idlink,
    dl.documentName
from mainrecord as m
    left outer join documentlinks as dl on dl.IDlink = m.id
where
    m.multiple = 1 or 
    not exists (select * from documentlinks as t where t.idlink = m.id and t.id < dl.id)
于 2012-11-02T11:18:11.567 回答
0

这个怎么样:

select * from mainrecord a inner join documentlinks b on a.Id=b.IDLink 
where b.id=(case 
   when a.multiple=1 then b.id 
   else (select max(id) from documentlinks c where c.IDLink=b.IDLink) end)
于 2012-11-02T11:31:02.713 回答