2014-05-01 34 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