2010-11-01 22 views
15

Wstawiam wewnętrzne sprzężenie w moim zapytaniu. Mam wynik, ale nie wiedziałem, że dane przychodzą w wynikach. Każdy może mi powiedzieć, że to, co łączy się z danymi wewnętrznymi, pasuje do danych. Pokazuję obraz. Istnieją dwie tabele (jedna lub dwie).Zamów przez Inner Dołącz

alt text

Według mnie, że pierwszy wiersz powinien być Mohit ale wyjście jest different.Please mi powiedzieć.

Z góry dziękuję.

Odpowiedz

3

Trzeba rozwiązać to jeśli chcesz dane wrócić w określony sposób. Kiedy mówisz, że oczekujesz, że "Mohit" będzie pierwszym rzędem, zakładam, że to mówisz, ponieważ "Mohit" jest pierwszym wierszem tabeli [One]. Jednak gdy SQL Server łączy się z tabelami, niekoniecznie dołącza się w takiej kolejności, w jakiej myślisz.

Jeśli chcesz, aby pierwszy wiersz z [One] został zwrócony, spróbuj sortować według [One].[ID]. Alternatywnie możesz order by dowolną inną kolumnę.

+0

Dziękuję za odpowiedź. Wiem o zamówieniu. Ale chcę wiedzieć, że Inner join działa wewnętrznie? –

+0

Po wykonaniu INNER JOIN, SQL Server określa najlepszy sposób na znalezienie pasujących wierszy (zagnieżdżonych pętli itp.). Powoduje to losowe porządkowanie wyników. – dotariel

+2

Ktoś wie, czy mogę wymusić (specjalnie dla SQLite), że łączyć się, by zostać "zamówione"? –

3

Dodaj ORDER BY ONE.ID ASC na końcu pierwszego zapytania.

Domyślnie nie ma żadnego zamówienia.

+0

, ale przy wybieraniu rekordów z tabeli w tym czasie Domyślna kolejność według "ASC" – Vijjendra

+0

Dziękuję za odpowiedź. Wiem o Porządku przez Ale chcę wiedzieć, jak Inner join działa wewnętrznie? –

+0

@Mohit - Po wykonaniu polecenia 'JOIN' nie ma porządku naturalnego. Otrzymane wyniki były poprawne, ale nieuporządkowane. Twoja pojedyncza tabela "SELECT" jest w kolejności, w jakiej jest prawdopodobnie z powodu indeksu klastrowego. – JNK

9

W pozycji SQL kolejność danych wyjściowych nie jest zdefiniowana, dopóki nie zostanie określona w klauzuli ORDER BY.

Spróbuj tego:

SELECT * 
FROM one 
JOIN two 
ON  one.one_name = two.one_name 
ORDER BY 
     one.id 
+0

+1: z klauzulą ​​"ORDER BY" zamówienie jest mało prawdopodobne i prawdopodobnie będzie przewidywalne (biorąc pod uwagę wystarczającą ilość informacji), ale punktem jest "wyjście nie jest zdefiniowane". – onedaywhen

+0

Dziękuję za odpowiedź. Wiem o zamówieniu. Ale chcę wiedzieć, że Inner join działa wewnętrznie? –

+0

Zbuduj plan dla zapytania (wystarczy nacisnąć 'Ctrl-L' w oknie zapytania), pokaże ci algorytm. – Quassnoi

1

SQL nie zwraca domyślnie żadnego zamówienia, ponieważ jest szybszy w ten sposób. Nie musi najpierw przechodzić przez twoje dane, a następnie decydować, co zrobić.

Należy dodać porządek według klauzuli i prawdopodobnie zamówienie, za pomocą którego zawsze będzie można oczekiwać ID. (Jest to duplikat nazwy, więc będę zakładać chcesz One.ID)

select * From one 
inner join two 
ON one.one_name = two.one_name 
ORDER BY one.ID 
4

Unikaj SELECT * w głównym zapytaniu.

uniknąć powielania kolumny: stan JOIN zapewnia One.One_Name i two.One_Name wyniesie zatem nie ma potrzeby, aby powrócić zarówno w klauzuli SELECT.

Unikaj powtarzających się nazw kolumn: zmień nazwę na One.ID i Two.ID używając "aliasów".

Dodaj klauzulę ORDER BY, używając nazw kolumn ("alizje" w stosownych przypadkach) z klauzuli SELECT.

Sugerowane re-write:

SELECT T1.ID AS One_ID, T1.One_Name, 
     T2.ID AS Two_ID, T2.Two_name 
    FROM One AS T1 
     INNER JOIN two AS T2 
      ON T1.One_Name = T2.One_Name 
ORDER 
    BY One_ID; 
-1

Tak Mohit smirkingman ma rację. Nawet jeśli użyjesz klauzuli "Zamień przez" bez podania konkretnego zamówienia, jako że wyśledzenie lub wysłanie wielkiej bazy danych daje nieprzewidywalne komentarze