这些是我的表(有一些记录):
Product:
ID PRICE NAME DESCRIPTION
1 100 laptop laptop_desc
2 200 mouse mouse_desc
3 300 伊吾 伊吾伊吾
Product_Translations:
PID LANG NAME DESCRIPTION
1 ch 伊吾 伊吾伊吾
以下是我的询问:
SELECT p.id,p.price,
COALESCE(pt.Name, p.Name) name,
COALESCE(pt.Description, p.Description) description
FROM Product p
LEFT JOIN Product_T pt
ON pt.PID = p.ID
AND pt.LANG = 'ch'
WHERE (UPPER(name) LIKE UPPER('%伊吾%'))
我原本以为这会返回2条记录(带有ID 1和3),但它只返回一条(一条id为3);我期望在JOIN完成后应用WHERE子句。但是,如果我给出如下所示的查询,它可以正常工作:
SELECT p.id,p.price,
COALESCE(pt.Name, p.Name) Name,
COALESCE(pt.Description, p.Description) Description
FROM Product p
LEFT JOIN Product_T pt
ON pt.PID = p.ID
AND pt.LANG = 'ch'
WHERE (UPPER(p.name) LIKE UPPER('%伊吾%') OR UPPER(pt.name) LIKE UPPER('%伊吾%'))
为什么我必须提到这两个表的条件?加入完成后,我不能对结果应用where子句吗?谢谢你的帮助。
答案 0 :(得分:1)
为什么不在COALESCE
子句中使用WHERE
函数?
SELECT p.id,p.price,
COALESCE(pt.Name, p.Name) Name,
COALESCE(pt.Description, p.Description) Description
FROM Product p
LEFT JOIN Product_T pt
ON pt.PID = p.ID
AND pt.LANG = 'ch'
WHERE UPPER(COALESCE(pt.Name, p.Name) LIKE UPPER('%伊吾%')
答案 1 :(得分:1)
我认为你假设列别名" name"正在WHERE子句中使用。例如如果我使用别名" name_name"代替
SELECT p.id,p.price,
COALESCE(pt.Name, p.Name) name_name,
COALESCE(pt.Description, p.Description) description
FROM Product p
LEFT JOIN Product_T pt
ON pt.PID = p.ID
AND pt.LANG = 'ch'
WHERE (UPPER(name_name) LIKE UPPER('%伊吾%'))
然而,执行顺序与写入顺序不同。 FROM& WHERE子句在SELECT子句之前执行,因此当您尝试使用它时,select子句中定义的列别名不存在。
FYI:这是子句执行的通用序列
FROM
JOINs (as part of the from clause)
WHERE
GROUP BY
HAVING
SELECT << column aliases defined now
ORDER BY
还要注意,由于这个序列,列别名可以在ORDER BY子句中使用
你的第二个查询的where子句是我推荐的,即
WHERE (UPPER(p.name) LIKE UPPER('%伊吾%') OR UPPER(pt.name) LIKE UPPER('%伊吾%'))
因为我更倾向于避免在where子句中使用性能和可维护性的函数。
答案 2 :(得分:0)
WHERE子句。 左连接的结果如下:
ID PRICE NAME DESCRIPTION PID LANG PNAME PDESCRIPTION
1 100 laptop laptop_desc 1 ch 伊吾 伊吾伊吾
2 200 mouse mouse_desc
3 300 伊吾 伊吾伊吾
因此,如果您为两个表添加OR条件,则会获得两条记录,否则您将获得一条记录。
答案 3 :(得分:0)
WHERE子句在连接之后但在选择SELECT项(包括COALESCE函数)之前应用。
您希望查询返回带有中文名称或翻译的两条记录。中文名称返回UPPER(p.name) LIKE UPPER('%伊吾%')
,中文翻译返回UPPER(pt.name) LIKE UPPER('%伊吾%')
。所以你确实需要OR条件,否则只返回一行。