【问题标题】:Counting Occurrences from One Table and Inserting into Another but Getting an Error从一个表中计算出现次数并插入到另一个表中但出现错误
【发布时间】:2021-03-30 20:35:16
【问题描述】:

我正在尝试计算每所学校出现在一组记录中的次数,并将该值记录在具有相应学校名称和 ID 的新表中。

使用的表类似于以下内容: 表 1-> school_probs

school_code (pk, bigint) school (text) probability
1 school1 Irrelevant info
2 school2 ii
3 school3 ii

Table2-> 模拟记录

record_id (pk, bigint) school (text) grade
1 school1 ii
2 school2 ii
3 school1 ii
4 school3 ii

我希望得到类似的输出

school_code (fk, bigint) school (text) schoolCount (integer)
1 school1 2
2 school2 1
3 school3 1

我可以通过以下代码实现这一点:

SELECT COUNT (simulated_records.school) AS schoolCount, school_probs.school_code, school_probs.school
FROM simulated_records, school_probs WHERE school_probs.school = simulated_records.school
GROUP BY simulated_records.school, school_probs.school_code, school_probs.school;

但是,我需要将结果保存在表格中。但是当我尝试

CREATE TABLE studentCount ( 
studentNum integer, school_code bigint, school text, 
CONSTRAINT fk_sC FOREIGN KEY (school_code) REFERNCES school_probs (school_code)
)
SELECT COUNT (simulated_records.school) AS schoolCount, school_probs.school_code, school_probs.school
FROM simulated_records, school_probs WHERE school_probs.school = simulated_records.school
GROUP BY simulated_records.school, school_probs.school_code, school_probs.school;

我收到“错误:在“SELECT”第 5 行或附近出现语法错误:SELECT COUNT (simulated_records.school) AS schoolCount, . . . SQL state: 42601"

第 5 行内容如下: SELECT COUNT (simulated_records.school) AS schoolCount, school_probs.school_code, school_probs.school

谁能指出我正确的方向?我计划以此创建一个函数。

创建表格的代码:

DROP TABLE IF EXISTS school_probs;
CREATE TABLE school_probs
(
  school_code bigint NOT NULL PRIMARY KEY,
  school text NOT NULL,
  probs numeric[] NOT NULL
);

INSERT INTO school_probs VALUES
(1,'school1','{0.05,0.08,0.18,0.3,0.11,0.28}'),
(2,'school2','{0.06,0.1,0.295,0.36,0.12,0.065}'),
(3,'school3','{0.05,0.11,0.35,0.32,0.12,0.05}');

DROP TABLE IF EXISTS simulated_records;
CREATE TABLE simulated_records
(
  record_id bigint NOT NULL PRIMARY KEY,
  school text NOT NULL,
  grade text NOT NULL
);

INSERT INTO simulated_records VALUES
(1,'school1','-'),
(2,'school2','-'),
(3,'school1','-'),
(4, 'school3', '-');

【问题讨论】:

  • 请不要发布代码图片的链接。这使得有人很难尝试。请编辑问题并将表格定义显示为文本。 5 号线在哪里?
  • PL/SQL 是 Oracle 的过程语言扩展。它与 Postgres 的 SQL 方言 无关。

标签: sql


【解决方案1】:

查找JOIN 语法,不要在FROM 子句中使用,。表别名也有帮助。

从查询创建表的语法是CREATE TABLE <table name> AS SELECT ...。没有列或约束定义。您可以在查询中使用显式强制转换来确定列类型。约束定义必须稍后添加ALTER TABLE

CREATE TABLE studentcount
AS
SELECT count(sr.school)::integer studentnum,
       sp.school_code::bigint,
       sp.school::text
       FROM simulated_records sr
            INNER JOIN school_probs sp
                       ON sp.school = sr.school
       GROUP BY sp.school,
                sp.school_code;

ALTER TABLE studentcount 
            ADD CONSTRAINT fk_sc 
                           FOREIGN KEY (school_code)
                                       REFERENCES school_probs
                                                  (school_code);

或者,您可以先发出带有列和约束定义的“普通”CREATE TABLE,然后插入查询中的行。

CREATE TABLE studentcount
             (studentnum integer,
              school_code bigint,
              school text,
              CONSTRAINT fk_sc
                         FOREIGN KEY (school_code)
                                     REFERENCES school_probs
                                                (school_code));

INSERT INTO studentcount
            (studentnum,
             school_code,
             school)
            SELECT count(sr.school),
                   sp.school_code,
                   sp.school
                   FROM simulated_records sr
                        INNER JOIN school_probs sp
                                   ON sp.school = sr.school
                   GROUP BY sp.school,
                            sp.school_code;

但请注意,无论哪种方式,您都在创建数据冗余。这可能导致不一致,应该避免。如果您不只是暂时需要它,而是稍后再使用当前值,请考虑使用视图。

CREATE VIEW studentcount
AS
SELECT count(sr.school)::integer studentnum,
       sp.school_code::bigint,
       sp.school::text
       FROM simulated_records sr
            INNER JOIN school_probs sp
                       ON sp.school = sr.school
       GROUP BY sp.school,
                sp.school_code;

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多