标签: join

表连接匹配无重复

我有一种情况,我需要在一个位置匹配资产的到达和离开。问题是资产移动并不总是按时间顺序输入数据库,也没有任何当前的方法将数据库中的到达和离开联系在一起。

注意事项:

  • 每个移动(到达或离开)由具有唯一 ID (moveID) 的单行组成
  • 每行都将具有该项目唯一的项目 ID (itemID)。但是,每个项目在表中可能有多行(移动)。
  • 我想按时间顺序将资产的每个到达与出发相匹配,确保我们只将每个 moveID 与一个或更少的其他移动匹配(例如,我们需要允许到达和离开,仅到达或仅离开)。
  • 应根据位置进行匹配(例如,到达时的位置和货架或位置和子货架与出发时的位置和货架或位置和子货架相匹配)。
  • 这是一个 MS SQL Server

表的结构(类似)如下:

  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)

join sql-server

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

谓词中带有“或”的慢速连接行为

我面临着一种我无法理解和克服的情况。

简而言之,我们有左连接查询,如:

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)

oracle join oracle-10g plsql

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

LEFT JOIN 如何比未加入的查询返回更多的结果?

考虑以下查询:

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)

join

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

使用连接返回同一列的多个值?

我有两张桌子

  1. 用户

Rank表中,我保存了rank_idsupervisor_id。在Rank表中,我存储了rank名称。在rank_idsupervisor_id来自外键Rank表。

由于我必须同时选择rank_idsupervisor_id从同一个表(Rank),我如何加入两个表以得到结果namerank namesupervisor

数据线

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)

mysql join query mysql-5.5

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

将生成的系列与选择中的每一行结合起来

下面的选择返回我所有用户拥有的所有项目的数组。

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)

postgresql join

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

按引用表中的相关行数排序

假设有两个表:

用户

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)

随着查询我要检索:

  • 用户的 ID 和名称
  • 用户的电子邮件数
  • 用户的电子邮件及其 ID

我希望输出按电子邮件数量降序排列并过滤,仅包括以“a”开头的电子邮件。没有电子邮件的用户也应包括在内 - 将他们的电子邮件计数视为0。 …

postgresql join window-functions postgresql-9.3

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

了解多表连接与聚合

我有一个关于如何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)

SQL小提琴

当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。

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)

postgresql join aggregate

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

如何在内部联接中使用分组依据

我有两个表:

表格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)

join sql-server group-by

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

MySQL JOIN 查询产生错误的结果

我有两个表complaintscomplaints_reply在我的MySQl数据库中。用户可以添加存储在complaints投诉回复中的投诉存储在complaints_reply表中。我试图在特定条件下加入这两个表内容。在我提到我想要得到什么以及我面临的问题之前,我将首先解释这两个表的结构。


注意添加投诉的人是投诉所有者,添加投诉回复的人是投诉回复者。投诉所有者还可以添加回复。因此,他既可以是投诉所有者,也可以是投诉回复者。这两个表是一对多的关系。一个投诉可以有多个投诉回复。 member_idcomplaint表代表投诉所有者mem_idcomplaints_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)

mysql join

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

如何在表格中显示多个两个日期之间的所有日期?

我想显示特定记录的两个日期之间的所有日期

这是表:

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)

mysql join date

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