SQL选择查询 - 将“配对”记录放在一起

时间:2013-09-16 20:40:31

标签: sql postgresql

这是我的数据:

表1 ...

id 
field1
field2
...

表2 ...

id
table1_original_id
table1_new_id

Table1保存了本身无法更新的记录,虽然我为用户构建了一种机制,可以“更新”它们......他们选择一条记录,进行更改,这些更改实际上是作为新记录提交的。为了对话,我们假设Table1中有10条记录,ID为1到10.用户提交ID 3的更新.ID 3保持原样,并且新记录ID 11被添加到Table1。除了这条新记录外,Table2获得了一条新记录,ID = 1,t1_original_id = 3,t1_new_id = 11。

SQL会选择从Table1中检索“对”记录...在这种情况下,查询将为我提供... ID 3和11。

抓头

我不认为数据库平台是Postgres 8.4并且我正在通过PHP检索数据以在jqGrid中处理。如果您可以指向我在单独的jqGrid中显示每对记录的方向,可以获得奖励积分!

感谢您的时间和精力。

===编辑===
以下是我需要根据上述场景从查询返回的内容示例:

id    field1    field2
3     blah      stuff
11    more      things

一旦我有了这些对,我可以根据需要在PHP端进一步处理它们。

2 个答案:

答案 0 :(得分:0)

您需要JOINTable1两次,例如:

SELECT orig.id AS Orig_ID
     , orig.value AS Orig_Value
     , n.id AS New_ID
     , n.value AS New_Value
FROM Table2 a
JOIN Table1 AS orig
  ON a.table1_original_id = orig.id
JOIN Table1 AS n
  ON a.table1_new_id = n.id

演示:SQL Fiddle

更新: 要让它们按照您的需要进行配对而无需手动选择一组,您需要这样的东西:

SELECT sub.id,sub.value
FROM (SELECT a.id as Update_ID,o.id,o.value, '1' AS sort
      FROM Table2 a
      JOIN Table1 AS o
        ON a.table1_original_id = o.id
      UNION
      SELECT a.id as Update_ID, n.id,n.value, '2' AS sort
      FROM Table2 a
      JOIN Table1 AS n
        ON a.table1_new_id = n.id
      ) AS sub
ORDER BY Update_ID,sort

演示:Sql Fiddle

注意:将UNION更改为UNION + ALL,由于防火墙限制,无法将这些字词发送到彼此旁边。        硬编码的“1”和“2”使得原始版本始终出现在新版本之前。

答案 1 :(得分:0)

标准SQL解决方案

要获取两个单独的行(稍后在Q更新中指定),请使用UNION查询:

SELECT 'old' AS version, t1.id, t1.field1, t1.field2
FROM   table1 t1
JOIN   table2 t2 ON t2.table1_original_id = t1.id
WHERE  t2.id =  $some_t2_id  -- your t2.id here!

UNION ALL
SELECT 'new' as version, t1.id, t1.field1, t1.field2
FROM   table1 t1
JOIN   table2 t2 ON t2.table1_new_id = t1.id
WHERE  t2.id =  $some_t2_id;  -- your t2.id here!

注意:这是一个查询 按要求返回,再加上 version列,以便可靠地区分行

version | id | field1 | field2
--------+----+--------+--------
old     | 3  |  blah  | stuff
new     | 11 |  more  | things

更快的Postgres特定解决方案

更复杂但更短更快的解决方案:

SELECT version, id, field1, field2
FROM   (
   SELECT unnest(ARRAY['old', 'new']) AS version 
         ,unnest(ARRAY[table1_original_id, table1_new_id]) AS id
   FROM table2 t2 WHERE t2.id = $some_t2_id -- your t2.id here!
   ) t2
JOIN   table1 USING (id);

同样的结果。

-> SQLfiddle demo for both.