2014-05-01 32 views
0

我不是一个sql master,这个陈述对我来说并不合适。所以如果任何人都可以为我分解它,让我知道究竟是什么,我会非常感激。select语句w/TWO AS别名?

继承人的说法:

SELECT a.accountid,a.firstname,a.lastname,a.miName,a.legacyAccountid,a.accountType, 
SELECT count(invoices.invID) AS InvCount 
FROM invoices 
WHERE invoices.accountid = a.accountid AND invoices.statusID=0 AND invoices.Remaining>0 
AND dueDate < DATEADD(Day,1,GETDATE()) AS AccountStatus, 
SELECT count(lotOwnership.lotNumb) AS LotCount FROM lotOwnership WHERE lotOwnership.accountid = a.accountid AS Active 
FROM a 
WHERE a.accountid LIKE % var % OR a.legAccountid LIKE % var % OR a.lastname LIKE % var % AND a.accountType=1 ORDER BY a.lastname, a.firstname 

我很想知道的是:

如何在figgin弗兰克•这是合法的?林指的整个语句,但尤其在该嵌套查询:

SELECT count(lotOwnership.lotNumb) AS LotCount FROM lotOwnership WHERE lotOwnership.accountid = a.accountid AS Active 

出于某种原因,我不能换我的头解决这个问题。有人请救我!我不明白如何选择语句可以有两个别名???????????????????

+2

此代码是如此的脆弱不合法 –

+0

此代码似乎并不正确,您是否运行此代码? – Rohan

回答

1

代码缺少周围的子查询括号和引号字符串:

SELECT a.accountid,a.firstname,a.lastname,a.miName,a.legacyAccountid,a.accountType, 
(SELECT count(invoices.invID) AS InvCount 
FROM invoices 
WHERE invoices.accountid = a.accountid AND invoices.statusID=0 AND invoices.Remaining>0 
AND dueDate < DATEADD(Day,1,GETDATE()) 
) AS AccountStatus, 
(SELECT count(lotOwnership.lotNumb) AS LotCount FROM lotOwnership WHERE lotOwnership.accountid = a.accountid 
) AS Active 
FROM a 
WHERE a.accountid LIKE' % var %' OR a.legAccountid LIKE '% var %' OR a.lastname LIKE '% var %' AND a.accountType=1 
ORDER BY a.lastname, a.firstname 

我做了丑陋的代码风格的一小部分重新格式化,所以你能看到的变化。任何想法为什么这些人物都失踪了?

编辑:

考虑select(现在好格式)的前两行:

SELECT a.accountid, a.firstname, a.lastname, a.miName, a.legacyAccountid, a.accountType, 
     (SELECT count(invoices.invID) AS InvCount 
     FROM invoices 
     WHERE invoices.accountid = a.accountid AND 
       invoices.statusID = 0 AND 
       invoices.Remaining > 0 AND 
       dueDate < DATEADD(Day,1,GETDATE()) 
    ) AS AccountStatus, 

子查询定义为返回一个名为InvCount列。如果您单独运行它,它将有一个名称为InvCount的列。

在这种情况下,它是一个标量子查询。也就是说,返回(最多)一行和一个值的子查询。在这种情况下,返回值被视为表达式的结果。因此,子查询中名为InvCount的列在外部查询中被命名为AccountStatus。你可以这样想:

select ((select . . .) as InvCount) as AccountStatus 

当然,该语法不合法,但它从概念上捕获会发生什么。第一个别名简单地被忽略。

+0

忽略缺少的字符。此SQL代码来自一个自定义的VB应用程序。我只是试图围绕自从应用程序创建以来这种代码已经投入生产的可能性,并且它不会抛出任何错误。我只是想知道它的可能性,在嵌套选择性陈述中是否有两种。 – user2001006

+1

@ user2001006。 。 。我不知道你的意思。带有正确括号和单引号的代码在任何语句中都没有两个“as”。你是否困惑于像count(invoices.invID)这样的表达式可以在子查询('InvCount')中被赋予一个别名,而在外部'select'('AccountStatus')被赋予另一个别名。这是允许的。第一个简单地被忽略。 –

+0

是的!!!这正是我想弄明白的!请详细解释一下!你真棒! – user2001006

2

相关子查询需要用圆括号包围。然后,这是有道理的,因为它们会生成标量值,然后将其与AS混叠。

如果您在OP中的代码运行,那么应用程序必须知道如何隔离没有添加圆括号的子查询。

SELECT 
    a.accountid, 
    a.firstname, 
    a.lastname, 
    a.miName, 
    a.legacyAccountid, 
    a.accountType, 
    (SELECT 
     count(invoices.invID) AS InvCount 
     FROM invoices 
     WHERE invoices.accountid = a.accountid 
     AND invoices.statusID=0 
     AND invoices.Remaining>0 
     AND dueDate < DATEADD(Day,1,GETDATE())) AS AccountStatus, 
    (SELECT 
     count(lotOwnership.lotNumb) AS LotCount 
     FROM lotOwnership 
     WHERE lotOwnership.accountid = a.accountid) AS Active 
FROM a 
WHERE a.accountid LIKE % var % 
    OR a.legAccountid LIKE % var % 
    OR a.lastname LIKE % var % 
    AND a.accountType=1 
ORDER BY a.lastname, a.firstname