1

我想在 postgres 中加入以下 2 个表:

table1 (
   i1 character varying
 , i2 character varying
 , i3 character varying
)  

table2 (
   i4 character varying
 , startorend character varying
 , begin integer
 , end character integer
)

table1 包含以下值:

  p1  p2    p3
  p4  p10   p6
  p7  p8    p9
  p99 p199  p299

table2 包含以下值:

  p4  begin 1   12
  p4  end   13  14
  p7  begin 19  20
  p1  end   21  22

现在我想加入 2 个表,以便遵守以下规则:

1.当table1.i1=table2.i4时,则
   1a。如果有2行包含对应table2的begin和end,
       然后选择 table2.begin 和 table2.end
       分别来自 table2.i4 的开始和结束列。  
   1b。如果只有 1 行包含与 table2 对应的 begin 或 end,
       然后假设并将默认值写入 end(9999) 和 begin(0)。

通过应用上述规则,我得到下表:

p4      1            14
p1      0(default)   22 (as it just contains end column in table 2, therefore 0(begin) as default is inserted)
p7      19           9999(default) (as it just contains begin column in table2, therefore 9999(end) as default is inserted)

我可以有效地加入表格,但我们有可能插入默认值吗?

4

2 回答 2

1

您应该能够通过为开始值和结束值创建嵌套选择、执行外部连接、然后在未找到匹配行时使用 ISNULL 替换默认值来做到这一点。

SELECT Table1.i1, 
       ISNULL(BeginValues.begin, 0), 
       ISNULL(EndValues.end, 9999)
FROM Table1 LEFT OUTER JOIN 
        (SELECT i4, begin 
         FROM Table2 
         WHERE Table2.startorend = 'begin') AS BeginValues 
        ON Table1.i1 = BeginValues.i4 LEFT OUTER JOIN 
        (SELECT i4, end 
         FROM Table2 
         WHERE Table2.startorend = 'end') AS EndValues 
        ON Table1.i1 = EndValues.i4
于 2013-10-09T02:50:43.020 回答
1
SELECT i4
      ,CASE WHEN count(*) > 1 OR min(startorend) = 'begin' THEN min("begin")
            ELSE 0 END AS the_begin
      ,CASE WHEN count(*) > 1 OR min(startorend) = 'end'   THEN min("end")
            ELSE 9999 END AS the_end
FROM   table2 t2
WHERE  EXISTS (SELECT 1 FROM table1 t1 WHERE t1.i1 = t2.i4)
GROUP  BY i4

假设存在或仅存在一个或多个匹配行很重要table1.i1UNIQUE

beginendSQL 标准中的保留字。您不应该将它们用作标识符。这就是我双引号的原因。

于 2013-10-09T03:48:05.363 回答