我在oracle数据库中有一个表.架构是
create table PERIODS
(
ID NUMBER,
STARTTIME TIMESTAMP,
ENDTIME TIMESTAMP,
TYPE VARCHAR2(100)
)
Run Code Online (Sandbox Code Playgroud)
我有两个不同的TYPE's:TYPEA和TYPEB.具有独立的开始和结束时间,它们可以重叠.我想要找到的是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) 我有一个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.normalized为n1.normalized LIKE n2.normalized,因为该字段可能包含SQL通配符.
我也对以不同方式建模数据的想法持开放态度,但如果可以的话,我宁愿避免为每种语言使用单独的表.
给出以下表格:
学生
+----+-------+
| 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) 鉴于以下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) 你如何写一个雄辩的自我加入?我需要在模型上定义关系吗?
这是我的发言:
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) 这是我的测试表数据:
测试
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) 在我正在工作的项目中,数据库的一部分如下图所示
域类具有类似于以下的定义:
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) 我有一个人员表 - ID 主键和姓名。在我的应用程序中,人们可以与其他人有 0 或更多的现实世界关系,因此杰克可能“为”简“工作”,汤姆可能“取代”托尼,鲍勃可能“是”的雇员,而鲍勃也可能“结婚”给“玛丽。
在数据库中表示这一点的最佳方式是什么?多对多相交表?一系列自加入?一个关系表,每个关系对和类型一行,我可以在其中双向插入关系记录吗?
我有一个页面表.页面可以有父母,也可以是页面.我想选择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中修复它.
我试图在同一张表的另一行的基础上修改一个列的值,所以我正在使用自我连接,正在获得期望的更改,但是它选择了两行(原始行和修改过的行),我不想选择原始行,如果其任何列正在被修改,则仅应选择已修改的行(如果其值已被修改),否则应选择原始行。我创建了一个类似的架构来阐述这个问题:
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) self-join ×10
mysql ×3
sql ×3
activerecord ×2
database ×2
data.table ×1
distinct ×1
eloquent ×1
grails-orm ×1
grails3 ×1
grouping ×1
join ×1
laravel ×1
laravel-4 ×1
laravel-5 ×1
many-to-many ×1
oracle ×1
performance ×1
pivot ×1
r ×1
sql-server ×1
subquery ×1
yii2 ×1