我有一个我不太明白的问题:
SELECT DISTINCT TBL.*
FROM (
SELECT
attribute1,
attribute2,
etc...
FROM table) TBL
我猜测TBL给结果集一个名字,但为什么在select语句中有必要以及'。'是什么?做?
答案 0 :(得分:2)
点.
表示您正在访问表TBL的列(或所有列)(在您的情况下是子查询)
外部查询只将DISTINCT
应用于内部查询的每一列
请注意,在您的情况下,嵌套查询没有多大意义,您可以像这样重写查询:
SELECT DISTINCT att1, att2, ... FROM table
另请注意,如果您不使用聚合,则查询在功能上等同于Group by:
SELECT att1, att2, ... FROM table GROUP BY att1, att2, ...
答案 1 :(得分:1)
在您的示例中,TBL.*
和*
之间没有区别,但假设您的查询类似于
Select * from Customer
Inner Join Country on Country.ID = Customer.CountryID
where Country.Code = 'UK'
这将返回两个客户和国家/地区表格中的每一列,而
Select Customer.* from Customer
Inner Join Country on Country.ID = Customer.CountryID
where Country.Code = 'UK'
只会返回customer表中的列
答案 2 :(得分:0)
同样如此:
SELECT DISTINCT TBL.*
FROM (
SELECT
attribute1,
attribute2,
etc...
FROM (
SELECT
attribute1,
attribute2,
etc...
FROM table
) TBL2
) TBL
有点傻,不是吗?
TBL和TBL2是仅存在"的名称。为了引用查询中的内容。我指出,无论何时你在FROM
条款中提到table TBLn
的表格,它基本上等同于(SELECT * FROM table) TBLn
。
在查询中嵌入这些表达式(也就是派生表,嵌套视图,内联视图)有很多很好的理由,但只有当你看到一个不像你所做的那样毫无意义的例子时,它们的实用价值才会变得更加明显。我到了那里。
我不知道任何需要名称的平台TBL
。在某些情况下,将其排除在外是很方便的。在我的查询中,列引用中没有含糊不清,我甚至不必提及`TBL2'一点都不从这个意义上来说,我并没有"做"什么都没有。
在一个过程语言中,我可以制作一整套无意义的变量赋值(比如a1 = 42; a2 = a1; a3 = a2; a4 = a3; a5 = a4; ...
),编译器可能会意识到大多数变量从未被使用过,所以它不会浪费内存或CPU在它们上循环。它基本上承认你并没有真正地做着#34;什么与他们。不要将SQL视为过程语言,但以类似的方式,SQL解析器(和优化器)将解析所有这些临时/速记名称,并找出返回查询结果的最佳方法。 / p>
答案 3 :(得分:0)
正如我所看到的那样,问题启动者仍然不明白。我相信他知道一些OOP基础知识。 假设你的OOP编程语言中有一些类的数组。让我们说它是这样的:
<classA>Array[] TBL = new classA();
课程类似于:
class classA {
int attribute1,
string attribute2,
...
}
然后假设您已经拥有该类中的数据,因此数组TBL内部包含一些元素。
如果你想从这个数组中获取一些元素,你就会做类似TBL[1].getAttribute1, TBL[1].getAttribute2....
因此,在您的问题中,您拥有在SQL世界中称为SUBQUERY的数据数组,并将其命名为“TBL”(您可以选择任何您喜欢的名称)。
(
SELECT
attribute1,
attribute2,
etc...
FROM table) TBL
现在您想从此数组中获取元素。通过SQL语法,您需要指定您想要获得的确切内容。例如:TBL.attribute1,TBL.attribute2,...但是如果要显示此数组的所有元素,则只需使用*代替。 - &GT; TBL。*
现在让我们回到SUBQUERY。而不是它,你可以使用表/视图/功能。所有这些都可以使用您喜欢的任何名称命名(name = alias)。之后您可以使用此别名来更轻松地编写代码。