我有三张桌子
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 ,则不知道它们。现在我应该分成两个查询,或者有办法在一个查询中获取所有信息。
提前致谢。
答案 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
表单更好,因为子查询可以利用T2
和T1
上的索引。
答案 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)