我不确定我是否完全捏造了我的小型爱好数据库的设计(无论如何我都不是 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' 或者我是否只需要一些咖啡因。
这是我的两张表:
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) 假设我们有 10 亿条记录,并希望通过 post_type将它们存储在One或Three表中。
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 performance有3分离表和Join他们,或有1大表,并Select从它没有任何Join。
在某些情况下,我们最好为其他类型的轻型查询使用单独的表。
但我们害怕JOINS。
我有 3 个主表:Person,Publication和Conference
和 2 个多对多链接表:person_publication和person_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)
我怎样才能把他们全部加入?
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) 我最近阅读了很多关于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)
在这种情况下是否有首选方法?
这是我的简化数据库方案
-- -----------------------------------------------------
-- 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) 我正在使用 PHP 和 MySQL 的 Web 应用程序中工作。
我有两张桌子
员工
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)辅导
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”。 …
我在 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
我有三个表,代表两个实体和一个连接关系。每个实体关系都有一个人工代理键,用于代替自然键的外键约束。
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 中做到这一点?
join ×10
mysql ×4
postgresql ×4
performance ×2
subquery ×2
index-tuning ×1
innodb ×1
insert ×1
jdbc ×1
mysql-5.5 ×1
sql-server ×1
sqlite ×1
update ×1