SQLITE3子查询

SQLITE3子查询,sql,select,sqlite,Sql,Select,Sqlite,我有一个问题,我无法解决,即使在这里和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( idP

我有一个问题,我无法解决,即使在这里和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);
我得到:

IDO: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,我也不确定它为什么对您有效

第一个查询的内部查询(我将其称为Q1)是ok的:选择id,COUNT(id)AS total FROM。。。按id分组

但是第一个查询的外部查询被破坏了:选择id,MAX(total)FROM。。。;没有一个小组。这是错误的,因为MAX强制对整个表进行聚合(这是您想要的),但“id”没有聚合

如果从查询中删除“id”,则应正确获取最大值:选择MAX(total)作为最大值,从。。。;我叫它Q2

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

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

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

第二个查询是错误的,因为第一个查询是错误的;我认为它不是有效的SQL,我也不确定它为什么对您有效

第一个查询的内部查询(我将其称为Q1)是ok的:选择id,COUNT(id)AS total FROM。。。按id分组

但是第一个查询的外部查询被破坏了:选择id,MAX(total)FROM。。。;没有一个小组。这是错误的,因为MAX强制对整个表进行聚合(这是您想要的),但“id”没有聚合

如果从查询中删除“id”,则应正确获取最大值:选择MAX(total)作为最大值,从。。。;我叫它Q2

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

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

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

在许多情况下,从记录中获取其他列的最大值的最简单方法是使用
按顺序
/
限制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

在许多情况下,从记录中获取具有最大值的其他列的最简单方法是使用
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

你能发布一些示例数据吗?是的,当然,我会给你所有的。你能发布一些示例数据吗?是的,当然,我会给你所有的,因为SQLite允许聚合查询中的非聚合字段。因为,SQLite允许聚合查询中的非聚合字段。非常感谢,这很有效。我不明白到底为什么,但它起作用了。有人给了泰曼一些选票。非常感谢,这很有效。我不明白到底为什么,但它起作用了。有人给他投票。