SQL使用where子句连接,以应用某些条件

时间:2015-08-28 12:20:19

标签: sql hsqldb

这些是我的表(有一些记录):

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子句吗?谢谢你的帮助。

4 个答案:

答案 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)

在JOIN之后应用

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条件,否则只返回一行。