【问题标题】:SQLITE3 Sub-querysSQLITE3 子查询
【发布时间】:2013-06-02 05:04:56
【问题描述】:

我有一个问题,我无法解决,即使在这里和 sqlite.org 进行了重新研究之后

所以,我有这些表:

CREATE TABLE MEDICO(
    idMedico INTEGER PRIMARY KEY AUTOINCREMENT,
    nome VARCHAR(50) NOT NULL,
    morada VARCHAR(50) NOT NULL,
    telefone VARCHAR(9) NOT NULL
);



CREATE TABLE PRESCRICAO(
    idPrescricao INTEGER PRIMARY KEY AUTOINCREMENT,
    idConsulta INTEGER,
    idMedico INTEGER NOT NULL,
    nrOperacional INTEGER NOT NULL,
    FOREIGN KEY(idConsulta) REFERENCES CONSULTA(idConsulta),
    FOREIGN KEY(idMedico) REFERENCES MEDICO(idMedico),
    FOREIGN KEY(nrOperacional) REFERENCES UTENTE(nrOperacional)
);


CREATE TABLE PRESCRICAO_MEDICAMENTO(
    idPrescricao INTEGER ,
    idMedicamento INTEGER,
    nrEmbalagens INTEGER NOT NULL,
    FOREIGN KEY(idPrescricao) REFERENCES PRESCRICAO(idPrescricao),
    FOREIGN KEY(idMedicamento) REFERENCES MEDICAMENTO(idMedicamento),
    PRIMARY key(idPrescricao, idMedicamento)
);

我想要 MEDICO 最常用的 idMedicamento,比如说 idMedico=7, 到这里,一切都很好,我正在做:

  SELECT idmedicamento, MAX(total) as maximum
    FROM (SELECT idMedicamento, COUNT(idMedicamento) AS total
        FROM PRESCRICAO_MEDICAMENTO
        WHERE PRESCRICAO_MEDICAMENTO.idPrescricao IN (
            SELECT idPrescricao FROM PRESCRICAO
            WHERE PRESCRICAO.idmedico= 7
        )
        GROUP BY idMedicamento);

我得到:

IDmedicamento:3 最大:5

这是我想要的,它是正确的。

但是当我这样做时:

SELECT idMedicamento
FROM (SELECT idMedicamento, MAX(total) as maximum
FROM (SELECT idMedicamento, COUNT(idMedicamento) AS total
    FROM PRESCRICAO_MEDICAMENTO
    WHERE PRESCRICAO_MEDICAMENTO.idPrescricao IN (
        SELECT idPrescricao FROM PRESCRICAO
        WHERE PRESCRICAO.idmedico= 7
    )
    GROUP BY idMedicamento));

我得到的只是 MEDICO 上次使用的 idMedicamento,在本例中是 idMedicamento=5 的 MEDICAMENTO。

知道我做错了什么吗?实在想不通。

谢谢

【问题讨论】:

标签: sql select sqlite


【解决方案1】:

在很多情况下,从具有最大值的记录中获取其他列的最简单方法是使用ORDER BY/LIMIT 1

SELECT idMedicamento
FROM PRESCRICAO_MEDICAMENTO
WHERE idPrescricao IN (SELECT idPrescricao
                       FROM PRESCRICAO
                       WHERE idmedico = 7)
GROUP BY idMedicamento
ORDER BY COUNT(*) DESC
LIMIT 1

【讨论】:

  • 非常感谢,它成功了。不明白为什么,但它正在工作。有人给他一些选票。
【解决方案2】:

第二次查询错误是因为第一次查询错误;我认为它不是有效的 SQL,我不确定它为什么对你有用。

第一个查询的内部查询(我称之为 Q1)没问题:SELECT id, COUNT(id) AS total FROM ... GROUP BY id;

但是第一个查询的外层查询坏了:SELECT id, MAX(total) FROM ...;没有 GROUP BY。这是错误的,因为 MAX 强制对整个表进行聚合(这是您想要的),但 'id' 没有聚合。

如果您从查询中删除 'id, ',您应该正确获得最大值:SELECT MAX(total) AS maximum FROM ...;我将其称为 Q2。

然后它变得丑陋,因为 SQLite 不支持 CTE。基本上是:

SELECT id FROM (Q1) WHERE total = (Q2);

但是你必须写出Q1和Q2,因为Q2包括Q1所以有很多重复。

【讨论】:

  • 由于version 3.7.11,SQLite 允许在聚合查询中使用非聚合字段。
猜你喜欢
  • 2019-04-04
  • 2023-03-18
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2021-07-13
  • 2011-03-13
相关资源
最近更新 更多