sql - 仅当没有等于A的字段时才返回所有行?

时间:2012-12-29 20:10:44

标签: sql

我有点卡住了。我没有当前的SQL方便,但我会尽力清楚。说我有一张学生证的表格,以及课程编号和成绩。我想只返回没有等于A的成绩的学生。我不希望只有不等于A的行,但我想找到所有没有相关A等级的学生ID,否则至少有一个A的学生将不予退还。

我该如何解决这个问题?我对SQL很新。感谢

编辑:好的,既然我有实际的SQL,我可以放弃我可怕的类比。

SELECT  ALL
        ITEMS.QTY_ONHAND AS QTY_ONHAND,
        ITEMS.ITEM_ID AS ITEM_ID_I0,
        MEDORDER.MO_STAT AS MOMO_STAT,
        UPPER(ITEMS.ITEM_ID) AS ITEM_ID_IC,
        ITEMS.RX_DISP AS RX_DISP,
        OMNIS.OMNI_ID AS OMNI_ID,
        MEDORDER.ITEM_ID AS MOITEM_ID
  FROM   ITEMS ITEMS,
         MEDORDER MEDORDER,
         OMNIS OMNIS,
        "PATIENTS" PATIENTS
  WHERE (ITEMS.OMNI_STID = OMNIS.OMNI_STID) AND 
        (PATIENTS.PAT_ID = MEDORDER.PAT_ID) AND 
        (OMNIS.AREA = PATIENTS.AREA) AND (UPPER(ITEMS.ITEM_NAME) LIKE '%Doxycycline%'
     AND MEDORDER.ITEM_ID = UPPER(ITEMS.ITEM_ID)
     AND MEDORDER.MO_STAT='A')
  ORDER BY  ITEMS.QTY_ONHAND DESC, OMNIS.OMNI_ID, MEDORDER.ITEM_ID

我这里有一个位置,omni_id。我的查询是查找具有此item_id的每个omni_id。这将为每个omni_id返回多个结果,这些结果对应于同一item_id的多个medorder。我想要做的只是返回omni_ids,其中任何medorder.mo_stat等于'A'的结果为0。例如,omni_id 3W将有3个返回,wth medorder_mo_stat等于A,C和C.另外,4S,具有C,C,C的medorder.mo_stats。我只希望我的查询返回该4S组,因为它没有'A'的medorder.mo_stats。

对不好的解释感到抱歉..我现在正在进行一些项目的多任务处理,我的SQL-fu不是很强大,我不确定如何实现以下解决方案来获得我正在寻找的东西。< / p>

提前感谢

1 个答案:

答案 0 :(得分:0)

根据您的更新 - 我认为这可能有所帮助,但我仍然不确定我理解您的架构,所以也许我错过了一些东西......

SELECT
    OMNIS.OMNI_ID AS OMNI_ID,
    COUNT(MEDORDER.ITEM_ID) AS A_COUNT
FROM
    ITEMS
JOIN
    OMNIS
    ON  (ITEMS.OMNI_STID = OMNIS.OMNI_STID)
JOIN
    PATIENTS
    ON  (OMNIS.AREA = PATIENTS.AREA)
LEFT JOIN
    MEDORDER
    ON  (MEDORDER.ITEM_ID = UPPER(ITEMS.ITEM_ID)
    AND (PATIENTS.PAT_ID = MEDORDER.PAT_ID)
    AND (MEORDER.MO_STAT = 'A')
WHERE
    UPPER(ITEMS.ITEM_NAME) LIKE '%Doxycycline%'
GROUP BY
    OMNIS.OMNI_ID
HAVING
    COUNT(MEDORDER.ITEM_ID) = 0

^ EDIT ^


解决这个问题的方法很少。我会这样做:

SELECT
    StudentID,
    MAX(CASE Grade WHEN 'A' THEN 1 ELSE 0 END) AS HasAnA
FROM
    MyTable
GROUP BY
    StudentID
HAVING
    MAX(CASE Grade WHEN 'A' THEN 1 ELSE 0 END) = 0

或者甚至只是根据您的桌面设计:

SELECT DISTINCT
    StudentID
FROM
    MyTable
WHERE
    Grade != 'A'