0

我正在尝试运行给定三个表的查询。

DECLARE @TABLE1 TABLE (ID CHAR(2))
DECLARE @TABLE2 TABLE (ID CHAR(2))
DECLARE @TABLE3 TABLE (ID CHAR(2))

INSERT INTO @TABLE1 VALUES('1')
INSERT INTO @TABLE1 VALUES('2')
INSERT INTO @TABLE2 VALUES('1')

--NOTHING in TABLE3

我只需要获取存在的值并忽略空表。这不起作用,因为 TABLE3 没有值。

SELECT ID 
  FROM @TABLE1 
INTERSECT 
SELECT ID 
  FROM @TABLE2 
INTERSECT  
SELECT ID 
 FROM @TABLE3

 **Result should be 1**

如果它为空,我如何忽略任何表但保留其他值?

4

3 回答 3

1

为什么不从每个表中选择不同的并集,然后按 ID 分组并选择 count(*),并仅选择结果中 count(*) 等于 count(*) 最大值的行?

不幸的是,此时子查询有点混乱,但你应该明白逻辑:)

于 2013-01-22T03:52:34.313 回答
1

Intersect 对您不起作用,因为您无法为其添加条件。

据我了解,您希望选择 ID 出现在至少 2 个表中的所有记录。我假设每个表的 ID 都是唯一的。

以下适用于 MS SQL Server:

DECLARE @TABLE1 TABLE (ID CHAR(2))
DECLARE @TABLE2 TABLE (ID CHAR(2))
DECLARE @TABLE3 TABLE (ID CHAR(2))

INSERT INTO @TABLE1 VALUES('1')
INSERT INTO @TABLE1 VALUES('2')
INSERT INTO @TABLE2 VALUES('1')

--NOTHING in TABLE3
;WITH AllValues AS
(
    SELECT ID 
    FROM @TABLE1 
    UNION ALL
    SELECT ID 
    FROM @TABLE2 
    UNION ALL
    SELECT ID 
    FROM @TABLE3
)
SELECT  ID
FROM    AllValues
GROUP BY ID
HAVING  COUNT(*) > 1
于 2013-01-22T06:07:15.460 回答
0

也许……但是系统的设计非常陌生;一个真实世界的例子将有助于理解你想要做什么。

Select count(*), ID FROM (
Select ID from @table1
UNION
Select ID from @table2
UNION
Select ID from @table3) Derived
Where RowNum =1   
GROUP BY ID
ORder by count(*) DESC

更新了 where 子句在错误的地方

于 2013-01-22T04:18:33.437 回答