从具有UNION语句的Resultset中筛选值

时间:2017-12-13 21:09:31

标签: sql sql-server-2008

SELECT 
   t.PK_DocumentInstanceChapterExpanded  
   , t.StatusColumn
   FROM 
   (
    SELECT
    PK_DocumentInstanceChapterExpanded  
    ,STATUSFLAG
         FROM SECTION_TABLE1   --- Status of my section
            WHERE PK_DocumentInstanceChapterExpanded = 50734 
    UNION
    SELECT
    s.PK_DocumentInstanceChapterExpanded
    i.STATUSFLAG      --Status of my Item
        FROM SECTION_TABLE s     
            INNER JOIN ITEM_TABLE i ON i.FK_SECTIONKEY  = s.PK_SECTIONKEY  
            WHERE s.PK_DocumentInstanceChapterExpanded = 50734 
   ) t

我的结果

enter image description here

正如您所见,UNION将带来2条记录 1)部分 2)项目

当发生这种情况时,我只想要一个结果

我的期待

enter image description here

我无法避免使用UNION,因为它需要从同一个键的2个不同表中获取状态。

我在想的是我可以把它写成子查询并在顶部做一些选择,但我不想硬编码逻辑。

类似于STATUS COLUMN具有&PARATAL' PARTIAL'和'锁定'它应该只获取' PARTIAL' ELSE' LOCK'。

我甚至尝试了CASE但是它一次只能查看一列是否有办法查看结果集,看看这个列是否有多个值,只选择一个' PARTIAL'。

谢谢

2 个答案:

答案 0 :(得分:2)

您只需使用GROUP BYMAX

即可
SELECT   t.PK_DocumentInstanceChapterExpanded  
       , MAX(t.StatusColumn)
FROM     (
    SELECT     PK_DocumentInstanceChapterExpanded  
             , STATUSFLAG
    FROM       SECTION_TABLE1
    WHERE      PK_DocumentInstanceChapterExpanded = 50734 
    UNION
    SELECT     s.PK_DocumentInstanceChapterExpanded
               i.STATUSFLAG
    FROM       SECTION_TABLE s     
    INNER JOIN ITEM_TABLE i 
            ON i.FK_SECTIONKEY = s.PK_SECTIONKEY  
    WHERE      s.PK_DocumentInstanceChapterExpanded = 50734 
   ) t
GROUP BY t.PK_DocumentInstanceChapterExpanded

这样可行,因为PARTIAL按字母顺序大于LOCKED

答案 1 :(得分:0)

现在我不知道每个id每个表可以有多少行。但是,如果只有1,为什么你不写:

SELECT s.PK_DocumentInstanceChapterExpanded
 ,case when i.STATUSFLAG is not null then i.STATUSFLAG else s.STATUSFLAG end
FROM SECTION_TABLE s
LEFT JOIN ITEM_TABLE i ON i.FK_SECTIONKEY = s.PK_SECTIONKEY     
WHERE s.PK_DocumentInstanceChapterExpanded=50734