SQL Server:从tableA或tableB OR中选择

问题描述:

有没有办法在SQL Server中从table Atable B或两个表中进行选择?尽可能地,我不想使用动态SQL。我在类似的question中看到过这一点,但它只在1个表中选择。SQL Server:从tableA或tableB OR中选择

Declare @table = 1 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND @Table = 1 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND @Table = 2 
+0

你要选择这两个表时@table为空? – qxg

你可以试试这个:

你有两个解决方案大约价值@table。

你可以考虑@table = NULL约两个表的选择,或者你可以(为1和例如3和2)考虑@table =值, 所以您的查询变为:

如果选择@table = NULL:

Declare @table = NULL 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND (@Table = 1 OR @table IS NULL) 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND (@Table = 2 OR @table IS NULL) 

如果选择@Table =值(例如3)

Declare @table = 3 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND (@Table = 1 OR @table = 3) 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND (@Table = 2 OR @table = 3) 
+0

这个答案可能是我如何做到的。一种情况是从table1中选择,一种是table2,第三种情况是从两者中进行选择。直向前,易于维护。 –

+0

@LudvigRydahl:谢谢 –

+0

你的查询不会影响性能吗?尽管不是那么漂亮,我还是喜欢@MayowaO的回答。 –

希望这有助于:

SELECT maker, Product.model AS model_1, PC.model AS model_2, price 
FROM Product INNER JOIN PC ON PC.model = Product.model 
ORDER BY maker, PC.model; 
+0

如果表Product是空的,则此查询不会返回任何内容。 –

您可以使用if ... else语句来实现这一目标,如图贝罗W上。 我假设你想用@table来控制脚本应该做什么。

Declare @table = 1 

IF @table = 1 
BEGIN 
    SELECT * 
    FROM Table1 
    WHERE <stuff> 
END 

ELSE IF @table = 2 
BEGIN 
    SELECT * 
    FROM Table2 
    WHERE <stuff> 
END 

ELSE IF @table = 3 /* OR @table IN (1,2) --depends on how you want to handle this*/ 
BEGIN 
    SELECT * 
    FROM Table1 
    WHERE <stuff> 

    UNION ALL 

    SELECT * 
    FROM Table2 
    WHERE <stuff> 
END 

只要条件满足,脚本就会停止。 例如,如果@Table = 2,只有脚本的以下部分将运行:

ELSE IF @table = 2 
BEGIN 
    SELECT * 
    FROM Table2 
    WHERE <stuff> 
END