标签: join

根据日期(或日期范围)加入

我不确定我是否完全捏造了我的小型爱好数据库的设计(无论如何我都不是 DBA),但我有一个这样的表(主键是(staffid, effectivefrom)):

 staffid | target | effectivefrom
 --------|--------|---------------
  1      |  6.0   | 2012-01-01
  2      |  6.0   | 2012-01-01
  3      |  6.0   | 2012-01-01
  1      |  7.0   | 2012-03-01
Run Code Online (Sandbox Code Playgroud)

所以基本上,三名员工都是以 6.0 的目标开始的,但是在 3 月份,ID 1 的员工有了新的 7.0 目标。我想维护历史目标,因为它与其他表中的其他数据相关。

我想有一个用户定义的函数,它以日期为参数,这个函数需要根据日期将上表与另一个表连接起来。假设以 2 月 1 日为日期调用该函数,我希望联接的结果包括显示所有员工 6.0 的目标列。

像这样(我认为这行不通,因为之前可能有多行dateParameter):

 SELECT othertable.*, targets.target
     FROM othertable
     JOIN targets ON
         othertable.staffid = targets.staffid AND
         targets.effectivedate <= dateParameter;
Run Code Online (Sandbox Code Playgroud)

请让我知道我是否做了一个绝对的 DBA 'no-no' 或者我是否只需要一些咖啡因。

postgresql join database-design

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

使用 LIMIT 和 OFFSET 从内连接中检索数据

这是我的两张表:
table1

qid[PK]     |gid[PK]  |abcd     | xyz  |    date
---------------+---------+---------+------+------------
 00001      |     qwe |      54 |    a | 1994-11-29
 00002      |     asd |       0 |    s | 1994-11-29
 00003      |     azx |      50 | 0.25 | 1994-11-27
Run Code Online (Sandbox Code Playgroud)

表2

qid[PK]     | gid[PK] | user[PK]
------------+---------+--------
 00001      |     qwe | shreya
 00001      |     qwe | nagma
 00001      |     qwe | koena
 00001      |     qwe | paoli
 00002      |     asd | anushka
 00002      |     asd | angelina
 00003      |     azx | jolie
 00003 …
Run Code Online (Sandbox Code Playgroud)

postgresql join jdbc

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

Innodb 缓冲池和多个连接

假设我们有 10 亿条记录,并希望通过 post_type将它们存储在OneThree表中。

post_id   -> primary key  
post_type -> ( page, group, user )
user_id   -> index
date      -> index
Run Code Online (Sandbox Code Playgroud)

注意:我们有足够的 RAM 来存储缓冲池中的所有数据。( 大约 40 GB )
在我们的情况下,Reading数据库太多了

问题是:WHILE整个数据为ON缓冲池(RAM),有什么不同in performance3分离表和Join他们,或有1大表,并Select从它没有任何Join

在某些情况下,我们最好为其他类型的轻型查询使用单独的表。
但我们害怕JOINS

mysql innodb performance join

3
推荐指数
1
解决办法
2398
查看次数

给定 2 个多对多关系表,如何将 3 个表连接在一起?

我有 3 个主表:Person,PublicationConference

和 2 个多对多链接表:person_publicationperson_conference

我想将所有 3 个主表连接在一起(向我展示一个人参与的所有出版物和会议)

但到目前为止,我只能像这样查询个人对出版物或个人对会议:

select person.*, publication.*
from person
left join person_publication on person_publication.person_id = person.id
left join publication on person_publication.publication_id = publication.id;


select person.*, conference.*
from person
left join person_conference on person_conference.person_id = person.id
left join conference on person_conference.conference_id = conference.id;
Run Code Online (Sandbox Code Playgroud)

我怎样才能把他们全部加入?

mysql join

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

加入 sqlite 中的 Update 语句

CREATE TABLE Table_1 (
    Id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,
    EmailId VARCHAR
)

INSERT INTO Table_1 VALUES (1,'raj@gmail.com');
INSERT INTO Table_1 VALUES (3,'test@gmail.com');
INSERT INTO Table_1 VALUES (4,'false5@gmail.com');
INSERT INTO Table_1 VALUES (7,'false55@gmail.com');
INSERT INTO Table_1 VALUES (8,'falsefalse@gmail.com');
INSERT INTO Table_1 VALUES (9,'true1@gmail.com');
INSERT INTO Table_1 VALUES (11,'true2@gmail.com');
INSERT INTO Table_1 VALUES (12,'falsefalsefalse@gmail.com');
INSERT INTO Table_1 VALUES (13,'ravi@gmail.com');
INSERT INTO Table_1 VALUES (14,'rak@gmail.com');
INSERT INTO Table_1 VALUES (15,'false@gmail.com');
INSERT INTO Table_1 VALUES (16,'false66@gmail.com');


CREATE TABLE Table_2 (
    Id …
Run Code Online (Sandbox Code Playgroud)

sqlite join update

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

交叉应用与内部连接

我最近阅读了很多关于CROSS APPLYvs 的文章INNER JOIN。我尝试编写一些查询,它们都以类似的方式工作,执行计划似乎也相同。

也许有更深入知识的人可以向我解释这两者之间的区别?

OUTER APPLY (SELECT UserID
                , ActionPerformedDate = MAX(ActionDate)
            FROM dbo.AdminUsage
            WHERE SubscriberID = S.SubscriberID
                AND ActionPerformed = 'Some Action'
                AND Description = 'True'
            GROUP BY UserID) AS AU


LEFT JOIN (SELECT SubscriberID
                , UserID
                , MAX(ActionDate) OVER(PARTITION BY SubscriberID) AS ActionPerformedDate
            FROM dbo.AdminUsage
            WHERE ActionPerformed = 'Some Action'
                AND Description = 'True') AS AU
    ON AU.SubscriberID = S.SubscriberID
Run Code Online (Sandbox Code Playgroud)

在这种情况下是否有首选方法?

join sql-server subquery

3
推荐指数
1
解决办法
7799
查看次数

选择另一个表中具有多个条件的所有行

这是我的简化数据库方案

-- -----------------------------------------------------
-- Table `products`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `products` (
  `id` INT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `properties`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `properties` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `product_id` INT NULL,
  `key` VARCHAR(45) NULL,
  `value` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Data for table `products`
-- -----------------------------------------------------
INSERT INTO `products` (`id`, `name`) VALUES (1, 'English Book …
Run Code Online (Sandbox Code Playgroud)

mysql join

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

MYSQL 查询以查找两个日期范围之间的记录

我正在使用 PHP 和 MySQL 的 Web 应用程序中工作。

我有两张桌子

  1. 员工

    employee_id     email_id
    3             tl1@jasmine.com
    4             agent1@jasmine.com
    5             agent2@jasmine.com
    6             om1@jasmine.com
    7             tl2@jasmine.com
    
    Run Code Online (Sandbox Code Playgroud)
  2. 辅导

    coaching_id     emp_id  start_date  end_date
     1               4      2014-05-01  2014-10-02
     2               5      2014-12-18  2015-01-22
    
    Run Code Online (Sandbox Code Playgroud)

我想要查询以找出在指定日期范围(例如开始日期“2015-01-22”和结束日期“2015-03-12”)之间未注册任何辅导计划的员工。

现在我正在使用这样的查询,

SELECT employee_id 
FROM employee 
WHERE sup_id = 3 
AND employee_id NOT IN 
(
    SELECT emp_id 
    FROM (coaching) 
    WHERE (start_date NOT BETWEEN "2014-12-26" AND "2015-01-30") 
    AND (end_date NOT BETWEEN "2014-12-26" AND "2015-01-30")

)
Run Code Online (Sandbox Code Playgroud)

我有一个逻辑,“如果任何员工在给定的 start_date 和 end_date 已经加入了辅导计划,他就没有资格参加任何辅导计划。

例如:如果开始日期是“2014-12-26”,结束日期是“2015-01-30”。 …

mysql join subquery mysql-5.5

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

有没有办法可以加快针对此特定视图的查询?

我在 PostgreSQL 数据库中有三个表,我通过视图和一些连接进行查询。

CREATE TABLE network_info (
  network         CIDR          NOT NULL,
  some_info       TEXT          NULL,
  PRIMARY KEY (network)
);

CREATE TABLE ipaddr_info (
  ipaddr          INET          NOT NULL,
  some_info       INT           NULL,
  PRIMARY KEY (ipaddr, some_info)
);

CREATE TABLE ipaddrs (
  addr            INET          NOT NULL,
  PRIMARY KEY (addr)
);

CREATE VIEW ipaddr_summary AS
SELECT DISTINCT
  i.addr                  AS ip_address,
  a.some_info             AS network_info,
  COUNT(b.ipaddr)         AS ip_info_count
FROM ipaddrs AS i
LEFT JOIN network_info AS a
  ON (i.addr << a.network)
LEFT JOIN ipaddr_info AS b
  ON …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join database-design index-tuning postgresql-performance

3
推荐指数
1
解决办法
3332
查看次数

通过连接插入多个值

我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键​​,用于代替自然键的外键约束。

CREATE TABLE Person (
person_id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE
);

CREATE TABLE Group (
group_id SERIAL PRIMARY KEY,
group_name VARCHAR NOT NULL UNIQUE
);

CREATE TABLE GroupMember (
person_id INTEGER REFERENCES Person,
group_id INTEGER REFERENCES Group,
PRIMARY KEY (person_id, group_id)
);
Run Code Online (Sandbox Code Playgroud)

我想在关系中插入多个条目GroupMember,但使用关联实体的自然键。类似的东西:

INSERT INTO GroupMember (person_id,group_id)
SELECT person_id,group_id
FROM Person P, Group G, (
('alice','girls'),
('bob','boys'),
('alice','coolkids'),
('bob','coolkids')
) AS X
WHERE P.username = X.1 AND G.group_name = X.2;
Run Code Online (Sandbox Code Playgroud)

显然,上述语法无效,但希望能传达这个想法。有没有办法在 PostgreSQL 中做到这一点?

postgresql join insert

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