如何从子查询中获取数据,还知道子查询是否为空?

时间:2016-11-16 11:47:38

标签: sql

我有三张桌子

T1有列:

Number, ID

T2有列:

Number, ID

T3有列:

Number, Name

我知道一个ID值: MYID

我想选择T3中的每一行,其中 Number 等于T2或T1中的任何 Number ,其中 ID 等于 MYID 的。另外我想知道在T1或T2中具有相应 ID 等于 MYID 的所有 Number - (子查询)下文)。

我写了这个查询:

SELECT * FROM T3 where T3.Number in 
(SELECT T2.NUMBER FROM T2 where T2.ID=MYID
 union 
 SELECT T1.NUMBER FROM T1 where T1.ID=MYID)

使用此查询,如果在T3中不存在子查询中存在的某些 Number ,则不知道它们。现在我应该分成两个查询,或者有办法在一个查询中获取所有信息。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我建议将其写成:

SELECT T3.*,
       (CASE WHEN EXISTS (SELECT 1 FROM T2 WHERE T2.ID = MYID AND T2.NUMBER = T3.NUMBER)
             THEN 1
             WHEN EXISTS (SELECT 1 FROM T1 WHERE T1.ID = MYID AND T1.NUMBER = T1.NUMBER)
             THEN 1
             ELSE 0
        END) as flag
FROM T3;

这比UNION表单更好,因为子查询可以利用T2T1上的索引。

答案 1 :(得分:0)

在SQLServer中试试这个:(我猜你知道MYID是什么,我不知道)

WITH t
AS (SELECT
    T2.number
FROM T2
WHERE T2.ID = MYID
UNION
SELECT
    T1.number
FROM T1
WHERE T1.ID = MYID)


SELECT
*
,CASE
    WHEN EXISTS (SELECT
                *
            FROM t
            WHERE t.number = T3.number) THEN 1
    ELSE 0
END AS ExistsInOtherSets
FROM T3

答案 2 :(得分:0)

考虑到MYID是硬编码值;这样的事情应该可以做到....

SELECT * FROM T3 
where EXISTS (SELECT 1                       
              FROM T2 
              where T2.NUMBER = T3.Number
                AND T2.ID = MYID) 
OR    EXISTS (SELECT 1                       
              FROM T1 
              where T1.NUMBER = T3.Number
                AND T1.ID = MYID)