标签: self-join

递归自我查询

我有下表:

myTable:
+----+----------+
| id | parentID |
+----+----------+
|  1 |     null |
|  2 |        1 |
|  3 |        1 |
|  4 |        2 |
|  5 |        4 |
-----------------
Run Code Online (Sandbox Code Playgroud)

我想让所有行都追溯到没有parentID了.所以".... WHERE id = 5"会给我:

5, 4, 2, 1
Run Code Online (Sandbox Code Playgroud)

mysql parent-child self-join

9
推荐指数
1
解决办法
4894
查看次数

SQL:仅使用每行一次的自联接

可能重复:
来自sql中的交叉连接的组合(不是排列)

我目前有一张包含以下记录的表格:

A1
A2
A3
B1
B2
C1
C2
Run Code Online (Sandbox Code Playgroud)

同一个字母表示一些共同的标准(例如,"字母"栏的共同值).我按照以下标准自行加入:

SELECT mytable.*, self.* FROM mytable INNER JOIN mytable AS self 
   ON (mytable.letter = self.letter and mytable.number != self.number);
Run Code Online (Sandbox Code Playgroud)

此连接提供如下内容:

A1 A2
A2 A1
A1 A3
A3 A1
A2 A3
A3 A2
B1 B2
B2 B1
C1 C2
C2 C1
Run Code Online (Sandbox Code Playgroud)

但是,我只想包括每一对(组合而不是排列).我如何得到以下内容:

A1 A2
A1 A3
A2 A3
B1 B2
C1 C2
Run Code Online (Sandbox Code Playgroud)

sql join self-join

9
推荐指数
1
解决办法
8624
查看次数

MySQL的.如何使用自我加入

我需要在这张桌子上使用Self Join.

+------------+------+--------+
| Country    | Rank |  Year  |
+------------+------+--------+
|France      |  55  |  2000  |
+------------+------+--------+
|Canada      |  30  |  2000  |
+------------+------+--------+ 
|Liberia     |  59  |  2001  |
+------------+------+--------+ 
|Turkey      |  78  |  2000  |
+------------+------+--------+ 
|Japan       |  65  |  2003  |
+------------+------+--------+
|Romania     |  107 |  2001  |
+------------+------+--------+
Run Code Online (Sandbox Code Playgroud)

我需要使用自我加入来获得与土耳其同年的国家.仅显示国家/地区和年份.

这就是我想要做的.

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a, table1 AS b 
WHERE a.Year=b.Year and a.Country='Turkey';
Run Code Online (Sandbox Code Playgroud)

^ googled自我加入,并成功.

我只得到土耳其.我究竟做错了什么?

mysql sql self-join

9
推荐指数
2
解决办法
3万
查看次数

将SQL表与自身进行比较(自联接)

我正在尝试根据混合列找到重复的行.这是我的一个例子:

CREATE TABLE Test
(
   id INT PRIMARY KEY,
   test1 varchar(124),
   test2 varchar(124)
)

INSERT INTO TEST ( id, test1, test2 ) VALUES ( 1, 'A', 'B' )
INSERT INTO TEST ( id, test1, test2 ) VALUES ( 2, 'B', 'C' )
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行此查询:

SELECT [LEFT].[ID] 
FROM [TEST] AS [LEFT] 
   INNER JOIN [TEST] AS [RIGHT] 
   ON [LEFT].[ID] != [RIGHT].[ID] 
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
Run Code Online (Sandbox Code Playgroud)

我希望能找回两个id.(1和2),但我只回到了一排.

我的想法是它应该比较每一行,但我想这不正确?为了解决这个问题,我将查询更改为:

SELECT [LEFT].[ID] 
FROM [TEST] AS [LEFT] 
   INNER JOIN [TEST] AS [RIGHT] 
   ON [LEFT].[ID] != [RIGHT].[ID] 
WHERE …
Run Code Online (Sandbox Code Playgroud)

sql join self-join

8
推荐指数
2
解决办法
2万
查看次数

与ActiveRecord中的多个自联接进行多对多关联

我试图通过自连接实现同一模型的记录之间的多个关系(基于@Shtééf的答案).我有以下型号

create_table :relations, force: true do |t|
  t.references :employee_a
  t.string     :rel_type
  t.references :employee_b
end

class Relation < ActiveRecord::Base
  belongs_to :employee_a, :class_name => 'Employee'
  belongs_to :employee_b, :class_name => 'Employee'
end

class Employee < ActiveRecord::Base
  has_many :relations, foreign_key: 'employee_a_id'
  has_many :reverse_relations, class_name: 'Relation', foreign_key: 'employee_b_id'

  has_many :subordinates, through: :relations, source: 'employee_b', conditions: {'relations.rel_type' => 'manager of'}
  has_many :managers, through: :reverse_relations, source: 'employee_a', conditions: {'relations.rel_type' => 'manager of'}
end
Run Code Online (Sandbox Code Playgroud)

通过此设置,我可以成功访问每个记录的下属和管理员列表.但是,我很难以下列方式建立关系

e = Employee.create
e.subordinates.create
e.subordinates #=> []
e.managers.create
e.managers #=> [] …
Run Code Online (Sandbox Code Playgroud)

activerecord many-to-many ruby-on-rails associations self-join

8
推荐指数
1
解决办法
2627
查看次数

SQL自连接成对

假设我有一个由像这样的条目组成的表

ID    Arrival Date    Arrival City    Departure Date    Departure City
1     Jun 27 2015     Berlin          Jun 20 2015       Paris
1     Jul 1 2015      Rome            Jun 29 2015       Berlin
1     Jul 30 2015     Vienna          Jul 15 2015       Rome
2     Jun 28 2015     Prague          Jun 23 2015       Vienna
2     Jul 1 2015      Rome            Jun 29 2015       Prague
2     Jul 30 2015     Vienna          Jul 15 2015       Moscow
...
Run Code Online (Sandbox Code Playgroud)

并且对于每个ID,我想将这些数据连接到自身,以便随后的观察Departure DateArrival Date成对分组 - 即离开与每个ID的先前到达配对.

在上面的例子中(为了方便起见,观察结果被排序),第2行将被附加到第1行,第3行到第2行,第5行到第4行以及第6行到第5行(因此产生4行字段ID Arrival Date Arrival City …

sql t-sql sql-server join self-join

8
推荐指数
2
解决办法
556
查看次数

如何使用phpMyAdmin添加指向同一个表的外键?

我有一个现有的InnoDB表,它已经有指向不同表的外键.

但是当我尝试创建指向主索引的外键时,我收到错误(检查数据类型).

该表是User with User_Id作为Primary.

我想要一个外键Manager_ID,这是一个FK到User_Id.

两个INT都长度10无符号...

但我仍然得到数据检查错误......?

mysql innodb foreign-keys phpmyadmin self-join

7
推荐指数
1
解决办法
9246
查看次数

(自我)按时间间隔加入

我在oracle数据库中有一个表.架构是

create table PERIODS
( 
  ID NUMBER, 
  STARTTIME TIMESTAMP, 
  ENDTIME TIMESTAMP, 
  TYPE VARCHAR2(100)
)
Run Code Online (Sandbox Code Playgroud)

我有两个不同的TYPE's:TYPEATYPEB.具有独立的开始和结束时间,它们可以重叠.我想要找到的是TYPEB那个开始的时期,完全包含或在给定的时期内结束TYPEA.

这是我到目前为止提出的(有一些样本数据)

WITH mydata 
     AS (SELECT 100                                                    ID, 
                To_timestamp('2015-08-01 11:00', 'YYYY-MM-DD HH24:MI') STARTTIME, 
                To_timestamp('2015-08-01 11:20', 'YYYY-MM-DD HH24:MI') ENDTIME, 
                'TYPEA'                                                TYPE 
         FROM   dual 
         UNION ALL 
         SELECT 110                                                    ID, 
                To_timestamp('2015-08-01 11:30', 'YYYY-MM-DD HH24:MI') STARTTIME, 
                To_timestamp('2015-08-01 11:50', 'YYYY-MM-DD HH24:MI') ENDTIME, 
                'TYPEA'                                                TYPE 
         FROM   dual 
         UNION ALL 
         SELECT 120                                                    ID, 
                To_timestamp('2015-08-01 12:00', 'YYYY-MM-DD HH24:MI') STARTTIME, 
                To_timestamp('2015-08-01 12:20', 'YYYY-MM-DD HH24:MI') ENDTIME, …
Run Code Online (Sandbox Code Playgroud)

sql oracle performance self-join query-optimization

7
推荐指数
1
解决办法
253
查看次数

使用JPA中的自联接从特定行组内检索行号

给定一个rating在MySQL数据库中命名的表.

+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| rating_id   | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| prod_id     | bigint(20) unsigned | YES  | MUL | NULL    |                |
| rating_num  | int(10) unsigned    | YES  |     | NULL    |                |
| ip_address  | varchar(45)         | YES  |     | NULL    |                |
| row_version | bigint(20) unsigned | NO   |     | 0       |                | …
Run Code Online (Sandbox Code Playgroud)

hibernate jpa self-join

7
推荐指数
1
解决办法
1343
查看次数

data.table 更新对非等价自联接的奇怪行为

在准备问题dplyr 或 data.table答案计算 R 中的时间序列聚合时,我注意到我确实得到了不同的结果,具体取决于表是就地更新还是作为新对象返回。此外,当我更改非等连接条件中的列顺序时,我确实得到了不同的结果。

目前,我对此没有解释,可能是由于我这边的重大误解或简单的编码错误。

请注意,这个问题特别要求解释观察到的data.table连接行为。如果您对潜在问题有其他解决方案,请随时发布原始问题的答案。

原始问题和工作答案

最初的问题是如何使用这些数据计算每位患者在住院前 365 天内的住院次数(包括实际住院次数):

library(data.table)   # version 1.10.4 (CRAN) or 1.10.5 (devel built 2017-08-19)
DT0 <- data.table(
  patient.id = c(1L, 2L, 1L, 1L, 2L, 2L, 2L),
  hospitalization.date = as.Date(c("2013/10/15", "2014/10/15", "2015/7/16", "2016/1/7", 
                                   "2015/12/20", "2015/12/25", "2016/2/10")))
setorder(DT0, patient.id, hospitalization.date)
DT0
Run Code Online (Sandbox Code Playgroud)
   patient.id hospitalization.date
1:          1           2013-10-15
2:          1           2015-07-16
3:          1           2016-01-07
4:          2           2014-10-15
5:          2           2015-12-20
6:          2           2015-12-25
7:          2 …
Run Code Online (Sandbox Code Playgroud)

join r self-join data.table

7
推荐指数
1
解决办法
477
查看次数