0

这是我的数据:

表格1...

id 
field1
field2
...

表2...

id
table1_original_id
table1_new_id

尽管我为我的用户建立了一种能够“更新”它们的机制,但表 1 保存了自身无法更新的记录……他们选择记录,进行更改,这些更改实际上是作为新记录提交的。为方便起见,我们假设 Table1 中当前有 10 条记录,ID 为 1 到 10。用户向 ID 3 提交更新。ID 3 保持原样,新记录 ID 11 被添加到 Table1。连同这条新记录,Table2 获得一条新记录,ID = 1,t1_original_id = 3 和 t1_new_id = 11。

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

挠头

我认为 DB 平台无关紧要的是 Postgres 8.4,我正在通过 PHP 检索要在 jqGrid 中处理的数据。如果你能指出我在单独的 jqGrid 中显示每对记录的方向,那么加分!

感谢您的时间和精力。

=== 编辑 ===
以下是我需要根据上述情况从查询返回的示例:

id    field1    field2
3     blah      stuff
11    more      things

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

4

2 回答 2

0

您需要JOIN两次Table1,例如:

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 小提琴

更新:要在不手动选择集合的情况下将它们配对,您需要这样的东西:

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 小提琴

注意:更改UNIONUNION+ ALL,由于防火墙限制,不能将这些单词并排发布。硬编码的 '1' 和 '2' 使原始总是出现在新的之前。

于 2013-09-16T20:56:08.850 回答
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 演示。

于 2013-09-16T21:15:43.967 回答