我有一种情况,我需要在一个位置匹配资产的到达和离开。问题是资产移动并不总是按时间顺序输入数据库,也没有任何当前的方法将数据库中的到达和离开联系在一起。
注意事项:
表的结构(类似)如下:
CREATE TABLE Movements
(
MoveID int IDENTITY (1,1),
ItemID int,
EventType CHAR,
moveTime datetime,
LocID int,
ShelfID int,
altShelfID int
)
Run Code Online (Sandbox Code Playgroud)
我已经包含了测试数据:
SET IDENTITY_INSERT movements on
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(1,3,'A','2013-01-05 09:00',1,3,NULL)
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(2,3,'D','2013-01-06 13:00',1,3,NULL)
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(3,3,'A','2013-01-07 09:00',1,3,NULL)
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(4,3,'A','2013-01-15 09:00',1,3,NULL)
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(5,3,'D','2013-01-07 15:00',1,3,NULL)
INSERT INTO movements
(MoveID,ItemID,EventType,moveTime,LocID,ShelfID,altShelfID)
VALUES(6,3,'A','2013-01-16 09:00',2,NULL,7) …Run Code Online (Sandbox Code Playgroud) 我面临着一种我无法理解和克服的情况。
简而言之,我们有左连接查询,如:
select from a
left join b on a.key1=b.key1 or a.key1=b.key2
Run Code Online (Sandbox Code Playgroud)
这工作非常缓慢,同时两者分开:
select from a
left join b on a.key1=b.key1
select from a
left join b on a.key1=b.key2
Run Code Online (Sandbox Code Playgroud)
工作非常快。
b.key1 有正常索引
b.key2 有正常索引
我无法理解这种行为的原因?我的连接策略或索引使用中是否缺少一些非常基本的东西?
在这里,我们有详细的计划:
无或(TOP_USTR_ADMIN_IP - ustrip 列的索引名称):
SQL> explain plan for
SELECT * FROM top.macs_constraint mc
LEFT JOIN top.top_ustr tu ON tu.ustrip = mc.IP;
Explained.
SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Plan hash value: 349751289
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost …Run Code Online (Sandbox Code Playgroud) 考虑以下查询:
mysql> SELECT count(*) FROM list l WHERE l.source='blink';
+----------+
| count(*) |
+----------+
| 3372 |
+----------+
1 row in set (0.00 sec)
mysql> SELECT count(*) FROM list l LEFT JOIN cardinal c ON l.id=c.id WHERE c.resolution IN ('Left','Right','Up') AND l.source='blink';
+----------+
| count(*) |
+----------+
| 5116 |
+----------+
1 row in set (2.47 sec)
Run Code Online (Sandbox Code Playgroud)
INSERT在这两个运行的查询之间没有在数据库上运行或运行其他查询。第二个查询似乎比第一个查询更严格,那么它怎么会返回更多的行呢?请注意,该list表有超过 200 万行,而该cardinal表大约有 50 万行。
编辑:添加EXPLAIN输出:
mysql> EXPLAIN SELECT count(*) FROM …Run Code Online (Sandbox Code Playgroud) 我有两张桌子
在Rank表中,我保存了rank_id和supervisor_id。在Rank表中,我存储了rank名称。在rank_id与supervisor_id来自外键Rank表。
由于我必须同时选择rank_id和supervisor_id从同一个表(Rank),我如何加入两个表以得到结果name,rank name和supervisor?
CREATE TABLE IF NOT EXISTS `user` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`Name` varchar(90) NOT NULL,
`rank_id` int(4) NOT NULL,
`supervisor_id` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
--
-- Dumping data for table `user`
--
INSERT INTO `user` (`id`, `Name`, `rank_id`, …Run Code Online (Sandbox Code Playgroud) 下面的选择返回我所有用户拥有的所有项目的数组。
WITH user_projects AS
(SELECT
u.id as user_id
,COALESCE(array_agg(DISTINCT pa.project_id), '{0}'::integer[]) as project_ids
FROM users u
LEFT JOIN project_assignments pa on pa.user_creator_id = u.id
GROUP BY u.id
)
user: 1, project_ids: {1, 2}
user: 2, project_ids: {3, 4}
Run Code Online (Sandbox Code Playgroud)
使用该选择,我想进行报告,该报告将为每个用户显示 12 个月的摘要。
SELECT
to_char(pk.created_at,'Mon') as mon
,extract(year from pk.created_at) as yyyy
,up.user_id
,COALESCE(count(distinct pk.keyword_id), 0) as total_keywords
FROM user_projects up
LEFT JOIN project_keywords pk on pk.project_id = ANY(up.project_ids::int[])
GROUP BY up.user_id, up.project_ids, 1, 2
Run Code Online (Sandbox Code Playgroud)
输出:
mon: sept, yyyy: 2014, user_id: 1, …Run Code Online (Sandbox Code Playgroud) 假设有两个表:
用户
id [pk] | name
--------+---------
1 | Alice
2 | Bob
3 | Charlie
4 | Dan
Run Code Online (Sandbox Code Playgroud)
电子邮件
id | user_id | email
----+---------+-------
1 | 1 | a.1
2 | 1 | a.2
3 | 2 | a.3
4 | 2 | b.1
5 | 2 | a.4
6 | 2 | a.5
7 | 3 | b.2
8 | 3 | a.6
Run Code Online (Sandbox Code Playgroud)
随着单查询我要检索:
我希望输出按电子邮件数量降序排列并过滤,仅包括以“a”开头的电子邮件。没有电子邮件的用户也应包括在内 - 将他们的电子邮件计数视为0。 …
我有一个关于如何JOIN在多个表上工作的基本问题。我想计算link1&中外键的出现次数link2
CREATE TABLE main (
id SERIAL PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE link1 (
id SERIAL PRIMARY KEY,
main_id integer NOT NULL,
CONSTRAINT main_id_fk FOREIGN KEY (main_id) REFERENCES main (id)
);
-- link2 is similar to link1
Run Code Online (Sandbox Code Playgroud)
当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。
SELECT main.id, COUNT(link1.main_id) + COUNT(link2.main_id)
FROM main
LEFT JOIN link1 ON main.id=link1.main_id
LEFT JOIN link2 ON main.id=link2.main_id
GROUP BY main.id
Run Code Online (Sandbox Code Playgroud) 我有两个表:
表格1
ID totalamount
--- -----------
100 1000
101 500
Run Code Online (Sandbox Code Playgroud)
表 2
ID Individualamount
--- ----------------
100 500
100 300
100 100
101 200
101 300
Run Code Online (Sandbox Code Playgroud)
我需要一个结果显示
ID TotalAmount sum(Individualamount) difference (TA-IA) % of diff
--- ----------- --------------------- ------------------ ---------
100 1000 900 100 10
101 500 500 0 0
Run Code Online (Sandbox Code Playgroud) 我有两个表complaints,complaints_reply在我的MySQl数据库中。用户可以添加存储在complaints投诉回复中的投诉存储在complaints_reply表中。我试图在特定条件下加入这两个表内容。在我提到我想要得到什么以及我面临的问题之前,我将首先解释这两个表的结构。
注意:添加投诉的人是投诉所有者,添加投诉回复的人是投诉回复者。投诉所有者还可以添加回复。因此,他既可以是投诉所有者,也可以是投诉回复者。这两个表是一对多的关系。一个投诉可以有多个投诉回复。 member_id在complaint表代表投诉所有者mem_id在complaints_reply代表投诉回答者
连接两个表并获取值并将投诉和投诉的回复显示为单个结果集。但条件有点棘手。表中最后添加的投诉回复complaints_reply应以complaints投诉所有者不应成为投诉回复者的方式为表格中的投诉获取。我使用posted_date& posted_timefrom complaints_replytable 来获取最后添加的投诉回复,并且投诉回复必须显示在结果集中。
因此,从表现在包含的示例数据中,我应该得到的输出是:
+------+---------+----------+-------------+-------------------+
| id | title |member_id |last_replier |last_posted_dt |
+------+---------+----------+-------------+-------------------+
| 1 | x | 1000 |2002 | 2015-05-2610:11:17|
| 2 | y | 1001 |1000 | 2015-05-2710:06:16|
+------+---------+----------+-------------+-------------------+
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
+------+---------+----------+-------------+-------------------+
| id | title |member_id |last_replier |last_posted_dt |
+------+---------+----------+-------------+-------------------+
| …Run Code Online (Sandbox Code Playgroud) 我想显示特定记录的两个日期之间的所有日期
这是表:
ID Start_Date End_Date
-------------------------
1 2013-01-14 2013-01-18
2 2013-02-01 2013-02-04
Run Code Online (Sandbox Code Playgroud)
现在我想获取从日期到日期之间的所有日期。
预期输出
ID Date
-------------
1 2013-01-14
1 2013-01-15
1 2013-01-16
1 2013-01-17
1 2013-01-18
2 2013-02-01
2 2013-02-02
2 2013-02-03
2 2013-02-04
Run Code Online (Sandbox Code Playgroud)
指导我编写查询而不创建任何额外的表。
我已经尝试过以下查询
select * from
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) selected_date from
(select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union …Run Code Online (Sandbox Code Playgroud) join ×10
mysql ×3
postgresql ×3
sql-server ×2
aggregate ×1
date ×1
group-by ×1
mysql-5.5 ×1
oracle ×1
oracle-10g ×1
plsql ×1
query ×1