标签: self-join

(自我)按时间间隔加入

我在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
查看次数

使用ActiveRecord自行加入桌面

我有一个ActiveRecord调用Name,其中包含各种名称Languages.

class Name < ActiveRecord::Base
  belongs_to :language

class Language < ActiveRecord::Base
  has_many :names
Run Code Online (Sandbox Code Playgroud)

用一种语言查找名称很容易:

Language.find(1).names.find(whatever)
Run Code Online (Sandbox Code Playgroud)

但我需要找到匹配的对,其中语言1和语言2具有相同的名称.在SQL中,这需要一个简单的自联接:

SELECT n1.id,n2.id FROM names AS n1, names AS n2
  WHERE n1.language_id=1 AND n2.language_id=2
    AND n1.normalized=n2.normalized AND n1.id != n2.id;
Run Code Online (Sandbox Code Playgroud)

如何使用ActiveRecord执行此类查询?请注意,我需要找到一对名称(=匹配的两侧),而不仅仅是语言1中恰好与某些内容匹配的名称列表.

对于奖励积分,替换n1.normalized=n2.normalizedn1.normalized LIKE n2.normalized,因为该字段可能包含SQL通配符.

我也对以不同方式建模数据的想法持开放态度,但如果可以的话,我宁愿避免为每种语言使用单独的表.

mysql activerecord ruby-on-rails self-join

6
推荐指数
1
解决办法
7092
查看次数

加入两个表(具有1-M关系),其中第二个表需要"展平"为一行

给出以下表格:

学生

+----+-------+
| id | Name  |
+----+-------+
| 1  | Chris |
| 2  | Joe   |
| 3  | Jack  |
+----+-------+
Run Code Online (Sandbox Code Playgroud)

注册

+---------------+------------+-----------+----------+
| enrollment_id | student_id | course_id | complete |
+---------------+------------+-----------+----------+
| 1             | 1          | 55        | true     |
| 2             | 1          | 66        | true     |
| 3             | 1          | 77        | true     |
| 4             | 2          | 55        | true     |
| 5             | 2          | 66        | …
Run Code Online (Sandbox Code Playgroud)

mysql pivot join self-join

6
推荐指数
1
解决办法
4311
查看次数

财务数据 - R data.table - 按障碍分组

鉴于以下data.table财务数据:

userId  systemBankId    accountId   valueDate   quantity    description
871     0065            6422        2013-02-28  -52400      AMORTIZACION PRESTAMO       
871     0065            6422        2013-03-28  -52400  AMORTIZACION PRESTAMO   
871     0065            6422        2013-04-01  -3000000    AMORTIZACION PRESTAMO
871     0065            6422        2013-04-30  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-05-31  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-06-28  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-07-30  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-08-30  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-09-30  -52349  AMORTIZACION PRESTAMO   
871     0065            6422        2013-10-30  -52349  AMORTIZACION PRESTAMO   
871 …
Run Code Online (Sandbox Code Playgroud)

grouping r self-join data.table

6
推荐指数
1
解决办法
199
查看次数

自我加入Eloquent

你如何写一个雄辩的自我加入?我需要在模型上定义关系吗?

这是我的发言:

SELECT t2.title FROM products t1, products t2
WHERE t1.id = $id 
AND t2.color_id = t1.color_id AND
t2.id != $id
Run Code Online (Sandbox Code Playgroud)

self-join laravel eloquent laravel-4 laravel-5

6
推荐指数
1
解决办法
2584
查看次数

如何比较同一个表中的记录列?

这是我的测试表数据:

测试

ID      Name            Payment_Date   Fee                Amt
1       BankA           2016-04-01     100                20000
2       BankB           2016-04-02     200                10000
3       BankA           2016-04-03     100                20000
4       BankB           2016-04-04     300                20000
Run Code Online (Sandbox Code Playgroud)

我试图比较每个数据记录的字段名称,费用和金额,以查看是否有相同的值.如果它们具有相同的值,我想在那些记录上标记"Y".这是预期的结果

ID      Name            Payment_Date   Fee                Amt      SameDataExistYN
1       BankA           2016-04-01     100                20000    Y
2       BankB           2016-04-02     200                10000    N
3       BankA           2016-04-03     100                20000    Y
4       BankB           2016-04-04     300                20000    N
Run Code Online (Sandbox Code Playgroud)

我在下面尝试了这两种方法.但我正在寻找任何其他解决方案,所以我可以选择最适合我的工作.

方法1.

select t.*, iif((select count(*) from testing where name=t.name and fee=t.fee and amt=t.amt)=1,'N','Y') as SameDataExistYN from testing t
Run Code Online (Sandbox Code Playgroud)

方法2.

select t.*, …
Run Code Online (Sandbox Code Playgroud)

mysql sql subquery self-join nested-select

6
推荐指数
1
解决办法
559
查看次数

Grails自我引用标准

在我正在工作的项目中,数据库的一部分如下图所示

数据库部分

域类具有类似于以下的定义:

class File{
    String name
}

class Document{
    File file
}

class LogEntry{
    Document document
    Date date
}
Run Code Online (Sandbox Code Playgroud)

首先,我需要获取所有文档的最新LogEntry; 在SQL中我执行以下操作(SQL_1):

SELECT t1.* FROM log_entry AS t1 
LEFT OUTER JOIN log_entry t2 
on t1.document_id = t2.document_id AND t1.date < t2.date 
WHERE t2.date IS NULL
Run Code Online (Sandbox Code Playgroud)

然后在我的服务中我有这样的功能:

List<LogEntry> logs(){
    LogEntry.withSession {Session session ->
        def query =  session.createSQLQuery(
                """SELECT t1.* FROM log_entry AS t1 
                    LEFT OUTER JOIN log_entry t2 
                    on t1.document_id = t2.document_id AND t1.date < t2.date 
                    WHERE t2.date IS NULL"""
        )
        def …
Run Code Online (Sandbox Code Playgroud)

self-join grails-orm grails3

6
推荐指数
0
解决办法
138
查看次数

在数据库表中表示人员之间关系的适当方法是什么?

我有一个人员表 - ID 主键和姓名。在我的应用程序中,人们可以与其他人有 0 或更多的现实世界关系,因此杰克可能“为”简“工作”,汤姆可能“取代”托尼,鲍勃可能“是”的雇员,而鲍勃也可能“结婚”给“玛丽。

在数据库中表示这一点的最佳方式是什么?多对多相交表?一系列自加入?一个关系表,每个关系对和类型一行,我可以在其中双向插入关系记录吗?

database database-design many-to-many self-join

5
推荐指数
1
解决办法
4571
查看次数

在Yii2中,如何将表连接到自身?

我有一个页面表.页面可以有父母,也可以是页面.我想选择parent_id = NULL及其'children'的所有页面.但是当我试着这个

public function getPages()
{
    return $this->hasMany(Page::className(), ['parent_id' => 'id']);
}
Run Code Online (Sandbox Code Playgroud)

我得到一个1066不唯一的表/别名:'page'错误...我知道如何在Yii1中解决这个问题,但我无法弄清楚在Yii2中修复它.

activerecord self-join yii2

5
推荐指数
1
解决办法
3006
查看次数

如何在SQL Server自联接中删除重复的行

我试图在同一张表的另一行的基础上修改一个列的值,所以我正在使用自我连接,正在获得期望的更改,但是它选择了两行(原始行和修改过的行),我不想选择原始行,如果其任何列正在被修改,则仅应选择已修改的行(如果其值已被修改),否则应选择原始行。我创建了一个类似的架构来阐述这个问题:

    create table tbl
    (
        id int not null,    
        status int not null,
        name varchar null,
        subject varchar null,
        result varchar null
    );


    /* Create few records in this table */
INSERT INTO tbl VALUES(1, 1, 'A', 'sub1', 'Pending');
INSERT INTO tbl VALUES(2, 2, 'A', 'all', 'Passed');
INSERT INTO tbl VALUES(3, 1, 'B', 'sub1', 'Pending');
INSERT INTO tbl VALUES(4, 3, 'B', 'sub2', 'Failed');
INSERT INTO tbl VALUES(5, 3, 'C', 'sub1', 'Failed');
INSERT INTO tbl VALUES(6, 2, 'D', 'sub1', 'Passed');
INSERT …
Run Code Online (Sandbox Code Playgroud)

sql database sql-server distinct self-join

5
推荐指数
1
解决办法
98
查看次数