首页 > 解决方案 > 如何从子查询中获取两个值用于sql的where子句

问题描述

我必须在 where 子句中使用两个值来测试从子查询中获得的两个值是否相等。由于我正在处理现有应用程序,因此我想将其保留为子查询。以下是我的查询。

SELECT 
    o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM 
    ORDER o WITH (NOLOCK) 
INNER JOIN  
    PARTY p WITH (NOLOCK) ON o.ORDER_ID = p.PARTY_ID 
INNER JOIN 
    CUSTOMER c WITH (NOLOCK) ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE 
    (o.EMAIL_ADDRESS, c.CUSTOMER_ID) IN (SELECT EMAIL_ADDRESS, CUSTOMER_ID 
                                         FROM CUSTOMER_MASTER 
                                         WHERE insert_date > '01/02/2019')

我面临的问题是 where 子句中的第一个值 o.EMAIL_ADDRESS 引发以下错误:

在预期条件的上下文中指定的非布尔类型的表达式

当我在 where 子句中使用单个值时,它可以正常工作。

标签: sqlsql-server

解决方案


一种方法是使用EXISTS相关子查询。

SELECT o.EMAIL_ADDRESS, c.FIRST_NAME, p.PARTY_ID
FROM ORDER_HEADER oh  WITH (NOLOCK) 
INNER JOIN  PARTY p WITH (NOLOCK) ON o.ORDER_ID = p.PARTY_ID 
INNER JOIN CUSTOMER c WITH (NOLOCK) ON p.PARTY_ID = c.CUSTOMER_ID 
WHERE EXISTS(
    SELECT 1
    FROM CUSTOMER_MASTER AS cm
    WHERE cm.insert_date > '01/02/2019'
    AND o.EMAIL_ADDRESS = cm.EMAIL_ADDRESS
    AND c.CUSTOMER_ID = cm.c.CUSTOMER_ID
    );

推荐阅读