it-swarm-eu.dev

Klauzule ORDER BY je povoleno ve sloupci, který není v seznamu SELECT?

Teoreticky každý příkaz v SQL Serveru vytváří virtuální tabulku předanou dalšímu příkazu. Jinými slovy, po dokončení klauzule FROM a Where je dalším krokem SELECt sloupce z virtuální skupiny vytvořené o krok dříve.

Je však možné objednat výsledek nastavený podle sloupce, který není uveden ve výběrovém seznamu.

Jak je možné, když je klauzule SELECT spuštěna před OBJEDNÁVKEM a která primární úloha je vybrat sloupce pro vykreslení?

Je to trochu matoucí nebo něco nechápu.

7
veljasije

Není to vždy možné:

Pokud je zadán DISTINCT, výraz v klauzuli ORDER BY má přístup pouze k virtuální tabulce vrácené v předchozím kroku (VT5)

(VT5 je vrácena virtuální tabulka generovaná pomocí SELECT)

Pokud není zadán parametr DISTINCT výrazy v klauzuli ORDER BY mají přístup jak k vstupním, tak výstupním virtuálním tabulkám fáze SELECT.

Vysvětlení je převzato z "Inside SQLServer 2008 T-SQL Querying" - nejsem si jistý, zda je tato konkrétní kapitola k dispozici online (Krok 6: Prezentace ORDER BY Fáze, str. 16.)

Tím pádem,

SELECT distinct field2 FROM table1 order by field1 

dává chybu:

Msg 145, úroveň 15, stav 1, řádek 1
Položky OBJEDNÁVKA BY se musí objevit ve výběrovém seznamu, pokud je zadán VÝBĚR DISTINCT.

8
a1ex07

V tomto scénáři se stane sloupec, který je seřazen, nyní bude součástí operace Output operace skenování/vyhledávání. Vezměme například tento příklad:

CREATE TABLE [dbo].[TestTable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [some_int] [int] NOT NULL,
    [some_string] [char](128) NOT NULL,
    [some_bigint] [bigint] NOT NULL,
);
go

ALTER TABLE [dbo].[TestTable] 
ADD  CONSTRAINT [PK_TestTable_Id] 
PRIMARY KEY CLUSTERED 
(
    [id] ASC
);
GO

Nyní vezměte tento dotaz (žádné řazení, pouze načítání dat ze dvou sloupců):

select
    some_int,
    some_bigint
from TestTable;

enter image description here

Budeme mít plán provádění, který má pro skenování seskupeného indexu výstupní seznam some_int a some_bigint. Stejně, jak byste očekávali. Nyní změníme tento dotaz a seřadíte sloupec, ale nezahrnujte jej do vybraných dat sloupce:

select
    some_int,
    some_bigint
from TestTable
order by id;

enter image description here

Nyní máme výstupní seznam na skenování seskupeného indexu, který zahrnuje id, some_int, a some_bigint.

3
Thomas Stringer