Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 理解联合查询_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 理解联合查询

Sql 理解联合查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想知道是否有人可以向我解释这一点,如果我也能找到它的来源,那就太好了 USE AP; SELECT VendorName, VendorState FROM Vendors WHERE VendorState = 'CA' UNION SELECT VendorName, 'Outside CA' FROM Vendors WHERE VendorState <> 'CA' Order BY VendorName 我几乎可以用英语解释这个问题,我知道这个问题是这样的 从供应商表

我想知道是否有人可以向我解释这一点,如果我也能找到它的来源,那就太好了

USE AP;

SELECT VendorName, VendorState
FROM Vendors
WHERE VendorState = 'CA'
UNION
SELECT VendorName, 'Outside CA'
FROM Vendors
WHERE VendorState <> 'CA'
Order BY VendorName
我几乎可以用英语解释这个问题,我知道这个问题是这样的

从供应商表中选择VendorName和VendorState 显示位于加利福尼亚州的所有供应商州 加入

这就是我感到困惑的地方:


选择vendorName,'outside CA'-除了'outside CA'是一个字符串之外,它是什么,它是一个变量?如果vendorState值不是California,它如何知道用'Outside Ca'替换state值。

让您困惑的是UNION子句。它本质上是将两个不同的选择连接到一组结果中


您可以查看MySQL手册以获得技术解释或更简单的解释,请尝试Dreded

这里有两个因素:

UNION将多个结果集添加到一起,在本例中为两个,即获取从多个查询返回的行,并将它们组合到单个结果集中。作为旁白,您应该使用UNION,因为它性能更好。注意union不是联接,与联接没有任何共同之处。连接是水平的,联合是垂直的。联合中的所有查询必须具有相同数据类型的相同数字列。但是,您只需要在第一个查询中为列添加别名。我给下面的第二个加了别名,这样它就可以在没有工会的情况下运行

您可以选择静态数据作为查询的一部分。”“External CA”是静态的,即对于该查询中的每一行都返回该值,因为正如您所注意到的,我们在该查询中排除了CA

因此您有两个查询,第一个是状态CA,第二个是状态非CA,第二个查询不是显示状态,而是显示静态值“CA之外”。这两个查询联合在一起,形成一个结果集

最好的理解方法是创建一个例子——我强烈建议您将来理解这个例子

DECLARE @Vendors TABLE (VendorName VARCHAR(32), VendorState CHAR(2));

INSERT INTO @Vendors (VendorName, VendorState)
VALUES 
('Test 1','CA'),
('Test 2','CA'),
('Test 3','NY'),
('Test 4','NY');

SELECT VendorName, VendorState
FROM @Vendors
WHERE VendorState = 'CA'
UNION ALL
SELECT VendorName, 'Outside CA' VendorState
FROM @Vendors
WHERE VendorState <> 'CA'
ORDER BY VendorName;
如果删除联合,则会从两个查询中获得结果,例如:

卖方名称 卖方国家 测试1 加利福尼亚州 测试2 加利福尼亚州 正如其他人所说:

将两个查询的结果连接到单个结果集中。您可以控制结果集是否包含重复的行:

联合所有-包括重复项。 联合-排除重复项。 联合操作不同于联接:

并集连接两个查询的结果集。但工会是这样做的 不从从两个表中收集的列创建单独的行。A. JOIN比较两个表中的列,以创建结果行 两个表中的列数。以下是基本规则 使用UNION组合两个查询的结果集:

列的编号和顺序在所有列中必须相同 查询

数据类型必须兼容

假设您的表中有以下值:

在查询中,第一个结果集是:

SELECT VendorName, VendorState
FROM Vendors
WHERE VendorState = 'CA'
这会给你一些类似的东西:

然后是第二个结果集

SELECT VendorName, 'Outside CA'
FROM Vendors
WHERE VendorState <> 'CA'

或者SQL Server,因为这是OP的要求。谢谢大家现在查看这些。非常感谢!,现在很有意义。我在这篇文章中学到了比整个章节更多的东西,你有什么推荐的来源吗?@EGAM抱歉,没有,不是在这个级别,只要找到教程,看看它们是否有用。太棒了,现在我知道要找什么应该很容易了,谢谢!case是一个表达式而不是一个语句:格式化文本比SO上的图像更受欢迎。\n这个特定示例效率低下,根本不需要联合,并且可以更简单地表示为SELECT VendorName,当VendorState='CA'然后VendorState ELSE'EXTER CA'结束时按VendorName;从供应商订购VendorState;。此外,即使在使用联合时,也考虑使用联合所有,因为联合力重复删除是不同的。
SELECT 
    VendorName
    , CASE
        WHEN VendorState <> 'CA' THEN 'Outside CA'
        ELSE 'CA'
    END
FROM #temp1
Order BY VendorName