2017-11-03 2 views
0

ich auf eine Antwort zu suchen, die tatsächlich istEquivalent Subquery für eine Join

ist es möglich, jedes Mitglied werden zu gleichwertigen Subquery neu zu schreiben, ich weiß, dass Subquery Spalten können nicht äußere Abfrage ausgewählt werden. ich eine Abfrage in SQL Server ausgeführt werden, die

select DISTINct A.*,B.ParentProductCategoryID from [SalesLT].[Product] as 
    A inner join [SalesLT].[ProductCategory] as B on 
    A.ProductCategoryID=B.ProductCategoryID 

select A.* 
    from [SalesLT].[Product] as A 
    where EXISTS(select B.ParentProductCategoryID from [SalesLT]. 
[ProductCategory] as B where A.ProductCategoryID=B.ProductCategoryID) 

Beide dieser Abfrage ist mir Ausgabe 293 Zeilen geben, die ich erwartet hatte. Jetzt Problem ist Wie wähle ich [SalesLT]. [ProductCategory] die Spalte im 2. Fall?

Muss ich diese Unterabfrage in der select-Klausel zusammenführen, damit diese Spalte in der Ausgabe angezeigt wird?

Antwort

0

Sie könnten

select A.*, 
(
    select B.ParentProductCategoryID 
    from [SalesLT].[ProductCategory] as B 
    where A.ProductCategoryID=B.ProductCategoryID 
) ParentProductCategoryID 
from [SalesLT].[Product] as A 
where EXISTS(select 1 
    from [SalesLT].[ProductCategory] as B 
    where A.ProductCategoryID=B.ProductCategoryID) 

aber ich finde die JOIN Version viel intuitiver bedienen.

Sie können keine Daten aus der Unterabfrage EXISTS in der äußeren Abfrage verwenden. Der einzige Zweck der Unterabfrage besteht darin, zu beurteilen, ob die EXISTS für jedes Produkt wahr oder falsch ist.

+0

für jede Spalte der Tabelle Dann 2, wenn ich sie in reult brauchen, um ich tun müssen, wie ( wählen B.ParentProductCategoryID von [SalesLT] [ Product] als B wo A.ProductCategoryID = B.ProductCategoryID ) ParentProductCategoryID –

1

ist es möglich, jedes Mitglied werden zu gleichwertigen Subquery

Nein, neu zu schreiben, da können Zeilen 1) entfernen beitritt oder 2) multiplizieren Reihen

ex 1)

CREATE TABLE t1 (num int) 
CREATE TABLE t2 (num int) 

INSERT INTO t1 VALUES (1), (2), (3) 
INSERT INTO t2 VALUES (2) ,(3) 

SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num 

Gibt die Ausgabe

t1num t2num 
2  2 
3  3 

Die Zeile mit dem Wert 1 von t1 wurde entfernt. Dies geschieht nicht in einer Unterabfrage.

ex 2)

CREATE TABLE t1 (num int) 
CREATE TABLE t2 (num int) 

INSERT INTO t1 VALUES (1), (2), (3) 
INSERT INTO t2 VALUES (2) ,(3), (3), (3), (3) 
SELECT t1.num AS t1num, t2.num as t2num FROM t1 INNER JOIN t2 ON t1.num = t2.num 

Ausgang Gewährt

t1num t2num 
2  2 
3  3 
3  3 
3  3 
3  3 

Eine Unterabfrage würde die Anzahl der Zeilen in der Tabelle nicht ändern abgefragt werden.


In Ihrem Beispiel haben Sie eine existiert ... das wird nicht den Wert aus der zweiten Tabelle zurück.

Dies ist, wie ich Unterabfrage würde.

select A.* 
     ,(SELECT B.ParentProductCategoryID 
      FROM [SalesLT].[ProductCategory] B 
     WHERE B.ProductCategoryID = A.ProductCategoryID) AS [2nd table ProductCategoryID] 
    from [SalesLT].[Product] as A 
+0

ich diese diese Frage gestellt, wie ich vom Professor gehört haben, die austauschbar Mitglied werden und subquery können wir verwenden.Aber Ihre Antwort zeigt mir eine andere Sache, wie Sie sagten, sie sind nicht gleich stark –

+0

Sie können austauschbar verwendet werden, aber nur in einem Fall, denke ich. Ein LINKER JOIN gibt dieselbe Antwort, wenn Sie dem Primärschlüssel oder dem Wert 'DISTINCT' beitreten. Das liegt daran, dass die Join-Bedingung für LEFT JOIN eindeutig ist - daher werden Zeilen nicht multipliziert. In beiden Fällen geben beide NULL zurück, wenn sie bei den Verknüpfungsbedingungen nicht übereinstimmen. – Zorkolot

+0

Wenn ich Spalte aus der anderen Tabelle nicht auswählen kann, ist es schwer für mich zu sagen, dass sie austauschbar verwendet werden können. Ist es nicht? –