【问题标题】:Not sure what is causing sql error 306不确定是什么导致了 sql 错误 306
【发布时间】:2017-06-30 15:29:45
【问题描述】:

我原来在sql上有如下查询:

SELECT PROJECT_TYPE.PROJECT_TYPE_NAME, PROJECT.PROJECT_NAME, STATUS_TYPE.STATUS_TYPE_NAME,
COUNT(*) AS Tasks
FROM TASK
INNER JOIN PROJECT ON PROJECT.PROJECT_ID = TASK.PROJECT_ID
AND PROJECT.POURCENTAGE < 100               /* the following ANDs filters out inactive projects */
AND PROJECT.PROJECT_TYPE < 6
AND PROJECT.PROJECT_STATUS_ID < 3
INNER JOIN PROJECT_TYPE ON PROJECT.PROJECT_TYPE = PROJECT_TYPE.PROJECT_TYPE_ID
INNER JOIN STATUS_TYPE ON TASK.STATUS_TYPE_ID = STATUS_TYPE.STATUS_TYPE_ID
INNER JOIN PRIORITY_TYPE ON TASK.PRIORITY_TYPE_ID = PRIORITY_TYPE.PRIORITY_TYPE_ID
AND NOT PRIORITY_TYPE.PRIORITY_TYPE_NAME = 'Hold'                           
AND STATUS_TYPE.STATUS_TYPE_NAME IN ('To do','In Progress', 'To Verify')        /* only include projects in these 3 statuses */
GROUP BY PROJECT_TYPE.PROJECT_TYPE_NAME, PROJECT.PROJECT_NAME, STATUS_TYPE.STATUS_TYPE_NAME
order by 2, case status_type_name   /* orders by status */
  when 'To do' then 1
  when 'In Progress' then 2
  when 'To Verify' then 3
  else 4
  end

它正确地将特定状态下的任务数显示为such。但是,我想替换

project.project_name

在另一个名为

的表中列出了较短描述的表

project.project_desc

,看起来像this。我尝试通过将所有 project.project_name 替换为 project.project_desc 并添加

来实现这一点
AND PROJECT.PROJECT_DESC IS NOT NULL

第一个inner join下。但是,这会导致以下错误

SQL 错误 (306):text、ntext 和 image 数据类型不能 比较或排序,除非使用 IS NULL 或 LIKE 运算符。

我现在不确定这有什么问题,所有的空值都应该被过滤掉,所以我很困惑为什么查询不像以前那样运行,只是读取不同的表.我无权编辑数据库,所以这些更改必须通过查询来实现。

【问题讨论】:

标签: sql-server


【解决方案1】:

FWIW,我觉得这更容易阅读......

SELECT pt.project_type_name
     , p.project_name
     , st.status_type_name
     , COUNT(*) tasks
  FROM task t
  JOIN project p  
    ON p.project_id = t.project_id
  JOIN project_type pt
    ON pt.project_type_id = p.project_type 
  JOIN status_type st
    ON st.status_type_id = t.status_type_id 
  JOIN priority_type xt
    ON xt.priority_type_id = task.priority_type_id 
 WHERE p.pourcentage < 100               
   AND p.project_type < 6
   AND p.project_status_id < 3
   AND xt.priority_type_name != 'hold'                           
   AND st.status_type_name IN('to do','in progress', 'to verify')  
 GROUP 
    BY pt.project_type_name
     , p.project_name
     , st.status_type_name
 ORDER 
    BY p.project_name
     , FIELD(status_type_name,'to do','in progress','to verify')

【讨论】:

  • 我从不喜欢那种逗号风格,在GROUPORDER 后面加上BY 似乎有悖常理。但这真的回答了这个问题吗?
  • @Barmar 下一次,我一定会使用 cmets 标记窗口 - 但在回答时,我理解这是 MySQL。我想以上内容在目前的情况下并没有真正的意义。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2016-05-06
  • 2013-01-16
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 2011-08-13
  • 2012-10-06
相关资源
最近更新 更多