为更多相同的人创建唯一标识符(SQL)

时间:2017-08-22 09:43:47

标签: sql postgresql kissmetrics

我有两张桌子:

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

别名表告诉我两个人是否实际上是同一个人。如果是这种情况,我希望为这些人提供唯一的ID。

电子。 G。: function createEvent_ (namedValues) { var options = { description: namedValues.Description[0], location: namedValues.Location[0], guests:"johan@inprint.co.za"}; var cEvent = CalendarApp.getCalendarsByName("TEST")[0].createEvent( namedValues.Name[0], new Date(namedValues.Starts + " " + namedValues.Stime), new Date(namedValues.Ends + " " + namedValues.Etime), options) }

|-------------| |-------------| | Person | | Alias | |-------------| |-------------| | person_id | | person_id_1 | | person_name | | person_id_2 | |-------------| |-------------|

现在我想创建一个视图,查询,你命名,它列出了所有person_ids和这些ID的唯一标识符。


|-------------------------|
| Person                  |
|-----------|-------------|
| person_id | person_name |
|-----------|-------------|
| 1         | Michail     |
|-----------|-------------|
| 2         | Michail     |
|-----------|-------------|
| 3         | Petja       |
|-----------|-------------|

有人可以帮助我使用唯一ID视图吗?我完全无能为力: - (

谢谢inb4,

米凯尔

1 个答案:

答案 0 :(得分:0)

我认为你已经有了一个可用于uniqe id的值。您只需强制person_id_1在同一个人身上是唯一的。确保你没有树状参考:

1 -> 2
2 -> 3
2 -> 4

这些树状连接通常很难在SQL中处理。

允许person_id_1重命名为original_id,将person_id_2重命名为secondary_id。如果您找到新连接,请说&#34; 5与3&#34;重复,查询表:

  • 在original_id列上是否存在?如果是,请插入新连接。
  • secondary_id列上是否存在
  • 3?如果是,请查询该行的original_id,然后插入新的连接。

这样你就可以避免链,你想要的查询就像

一样简单
select * from Alias 

如同@a_horse_with_no_name建议,您也可以简单地使用RECURSIVE WITH语句的查询:

WITH RECURSIVE conn(person_id_1, person_id_2) AS (
    SELECT person_id_1, person_id_2 from Alias
  UNION ALL
    SELECT Alias.person_id_1, conn.person_id_2
    FROM Alias, conn
    WHERE Alias.person_id_2 = conn.person_id_1
),
leaf_nodes AS (
  select distinct person_id_2 from Alias
)
select * 
from conn
where conn.person_id_1 NOT IN (select person_id_2 from leaf_nodes)
order by person_id_1;