【问题标题】:IN clause on multiple columns using AND , JOIN使用 AND 和 JOIN 对多个列进行 IN 子句
【发布时间】:2011-01-16 11:54:01
【问题描述】:

下列哪个查询是正确的

SELECT
 ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
WHERE
 STATUS IN('OPEN','UPDATED')
AND
 ITEM_TYPE IN ('ITEM1','ITEM2')
AND
 CREATED_TIME BETWEEN 'XX' AND 'YY'
AND
 UPDATED_TIME BETWEEN 'XX' AND 'ZZ'

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         STATUS IN('OPEN','UPDATED')
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         ITEM_TYPE IN ('ITEM1','ITEM2')
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         CREATED_TIME BETWEEN 'XX' AND 'YY'
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         UPDATED_TIME BETWEEN 'XX' AND 'ZZ'

【问题讨论】:

    标签: sql join in-clause


    【解决方案1】:

    第一个是正确的,除非您希望自联接呈指数爆炸式增长。

    【讨论】:

    • 我听说如果 UNION 将返回不同的行并且 UNIONALL 返回指数爆炸,如果我错了,请纠正我
    • 你不是在做一个 UNION,你是在做一个 JOIN。
    • 我很抱歉第二个查询,所以如果我使用联合我应该得到预期的结果 SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME WHERE STATUS IN('OPEN','UPDATED') UNION SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME WHERE ITEM_TYPE IN ('ITEM1','ITEM2') UNION SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME WHERE CREATED_TIME BETWEEN 'XX' AND 'YY' UNION SELECT ID, STATUS, ITEM_TYPE ,CREATED_TIME,UPDATED_TIME WHERE UPDATED_TIME BETWEEN 'XX' AND 'ZZ'
    • 我非常怀疑你会得到你想要的。如果可行,您为什么不直接执行第一个查询?
    【解决方案2】:

    第一个查询是正确的,第二个会给出,嗯....LOT 的结果。

    响应您的评论,正如SQLMenace 指出的那样,如果您想匹配任何条件,请改用 OR:

    SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
    WHERE STATUS IN('OPEN','UPDATED')
       OR ITEM_TYPE IN ('ITEM1','ITEM2')
       OR CREATED_TIME BETWEEN 'XX' AND 'YY'
       OR UPDATED_TIME BETWEEN 'XX' AND 'ZZ'
    

    或者,如果您想始终限制时间,但满足 任一第一个条件,则使用包装的 OR:

    SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
    WHERE (STATUS IN('OPEN','UPDATED') OR ITEM_TYPE IN ('ITEM1','ITEM2'))
      AND CREATED_TIME BETWEEN 'XX' AND 'YY'
      AND UPDATED_TIME BETWEEN 'XX' AND 'ZZ'
    

    【讨论】:

    • 感谢您的回复,但我遇到的问题是,如果任何一个条件失败,查询不会返回任何值。例如,如果 updated_time 没有匹配的行,即使所有其他条件都匹配,也不会返回任何行
    【解决方案3】:

    第一个

    JOINS 必须在 WHERE 子句之前

    虽然你可以用 EXISTS 重写 JOINS,然后你把它放在 WHERE 子句中

    【讨论】:

    • 你能举个例子吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 2019-05-11
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多