我不知道您使用的工具,但从Oracle的角度来看:
-
date
是保留字(用于
日期
数据类型),并且不能将其用作列别名;使用其他东西,例如。
c_date
就像在我的例子中一样。或者(不过我不建议这样做),将其括在双引号中:
"date"
-
您没有发布表的描述,但使用的语法看起来可疑。列名可以(也应该!)前面有表的别名,但列名不能包含点(除非——再次——如果在创建表时将它们括在双引号中,但必须使用双引号和匹配字母大小写,
总是
).
因此
No : M.restaurant.id
(probably) Yes: M.restaurant_id
(I doubt it) Yes: M."restaurant.id"
这
可以
可以(同样,取决于表的描述);我建议您先在Oracle中测试它,然后——如果它有效——将它移动到您的代码中:
SELECT
m.ymd AS c_date, --> here
ccr.name AS restaurant,
ccmt.name AS mealtype,
cf.name AS meal,
ci.name AS ingredient
FROM
menu m
JOIN commoncode ccr ON m.restaurant_id = ccr.id --> here
JOIN commoncode ccmt ON m.mealtype_id = ccmt.id --> here
JOIN food cf ON m.food_id = cf.id --> here
JOIN recipe cr ON cf.id = cr.food_id --> here
JOIN ingredients ci ON cr.ingredients_id = ci.id --> here
WHERE
m.ymd BETWEEN :startdate AND :enddate
AND ( :restaurantid IS NULL
OR m.restaurant_id = :restaurantid ) --> here
AND ( :mealtypeid IS NULL
OR :mealtypeid = 'M00'
OR m.mealtype_id = :mealtypeid ) --> here
ORDER BY
m.ymd,
ccmt.id