SQL 查询在 WHERE CLAUSE 中执行更多记录

Posted

技术标签:

【中文标题】SQL 查询在 WHERE CLAUSE 中执行更多记录【英文标题】:SQL Query execute more records in WHERE CLAUSE 【发布时间】:2019-01-23 08:52:20 【问题描述】:

我有从 VIEW 执行数据的 SQL 查询。在这个查询中,我有 4 个参数,所有参数数据都存储在另一个表中。 3个参数有数据在表中,1个参数没有记录。 3个参数共有“1080”条记录,但本次查询执行“16000”条记录。

我的 SQL 查询:

SELECT DISTINCT COL1, COL2, COL3, COL4

FROM TABLE

WHERE (COL1 IN (SELECT VAL FROM RPPARAMLIST where flg = 'I') OR COL1 = COL1)
AND (COL2 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'P') OR COL2 = COL2)
AND (COL3 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'C') OR COL3 = COL3)
AND (COL4 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'U') OR COL4 = COL4);

当我删除 WHERE CLAUSE 中的 OR 条件时,则显示空记录。

样本数据:

1080 条记录

输出数据:

13619 条记录

【问题讨论】:

分享样本数据及其预期输出 使用OR COL1 = COL1时会得到所有数据,排除所有COL1为null 【参考方案1】:

那些是“重言式”:所有的“和”都是短路的。您可以删除所有 whereand 子句,您将得到相同的结果:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE

会给你与你当前状态相同的结果:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE
WHERE (<condition> OR TRUE) -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE
AND (<condition> OR TRUE)   -- =TRUE

【讨论】:

第四列没有记录 @AmmadWasim 请编辑您的问题,添加示例数据和所需的输出 @AmmadWasim 没有专栏的标题,照原样,说明什么【参考方案2】:

在您的查询中放置“OR COL1 = COL1”将始终为真。我相信你想这样做:

SELECT DISTINCT COL1, COL2, COL3, COL4
FROM TABLE
WHERE COL1 IN (SELECT VAL FROM RPPARAMLIST where flg = 'I')
AND COL2 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'P') 
AND COL3 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'C') 
AND COL4 IN (SELECT TO_NUMBER(VAL) FROM RPPARAMLIST where flg = 'U');

【讨论】:

这个查询显示空记录,因为 COL4 没有记录 您能否给出每列的准确数据或样本数据以及所需的输出数据?【参考方案3】:

我认为这是您想要的查询:

SELECT DISTINCT t.col1, t.col2, t.col3, t.col4
FROM table_name t
WHERE EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'I' AND t.col1 = val 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'P' AND t.col2 = TO_NUMBER(val) 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'C' AND t.col3 = TO_NUMBER(val) 
        )
    OR EXISTS
        (
            SELECT 1 
            FROM rpparamlist 
            WHERE flg = 'U' AND t.col4 = TO_NUMBER(val) 
        );

此查询将检查所有带有rpparamlist 的4 个条件,然后将这4 个结果合并得到最后一个结果

【讨论】:

以上是关于SQL 查询在 WHERE CLAUSE 中执行更多记录的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE-Clause for INSERT 中重用子查询结果

如何在 SQL 的 WHERE CLAUSE 中的 CASE 内添加 sql“BETWEEN”条件

MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?

MySQLjava.sql.SQLException:Unknown column ‘****‘ in ‘where clause‘错误问题原因以及如何解决?

查询避免Unknown column ‘xxx’ in ‘where clause

mysql查询语句提示Unknown column 'zp' in 'where clause',求解!