2

habe ich die Daten, die diese Abfrage mit:zufällige Reihenfolge von in SQL Server

enter image description here

SELECT PT.ID AS ProductTypeId, 
     PT.ProductType, 
     PTPS.ID AS AssetId, 
     PTPS.Ordinal AS AssetOrdinal, 
     CASE 
      WHEN PTPS.LinkType = 2 
       THEN 
       --DS.ServerRootURL + 'Videos/ProductTypes/' + 
       --PTPSMaterialImage.LinkURL 
       (
        SELECT TOP 1 LinkURL 
        FROM ProductTypesPblmSolutions 
        WHERE ProductTypeId = PT.ID 
         AND LinkType = 1 
        ORDER BY ID DESC 
       ) 
      ELSE PTPS.LinkURL 
     END AS MaterialImage, 
     ATL.LinkType 
FROM ProductTypes PT 
INNER JOIN ProductTypesToApps PTA ON PT.ID = PTA.ProductTypeId 
INNER JOIN ProductTypesPblmSolutions PTPS ON PTPS.ProductTypeId = PT.ID 
INNER JOIN DealerSettings DS ON DS.DealerId = 23 
INNER JOIN AttachmentLinkTypes ATL ON ATL.ID = PTPS.LinkType 
WHERE PTA.AppId = 3 
    AND (PT.ID = 202 OR 202 IS NULL) 
    AND (ISNULL(PTPS.IsDeleted, 0) = 0) 
ORDER BY PTPS.Ordinal 

Lassen Sie sich über die materialimage Spalt sprechen. Ich muss zwei verschiedene Bilder für dieses Produkt bekommen, aber jetzt bekomme ich das gleiche Produkt.

Es gibt viele Linkurls für dieses Produkt. Bitte beziehen Sie sich auf diese Abfrage und ihre Daten.

SELECT ProductTypeId, 
     linkurl, 
     linktype 
FROM ProductTypesPblmSolutions 
WHERE ProductTypeId = 202 
    AND linktype = 1 

enter image description here

Das gleiche, was ich als Unterabfrage in meiner Haupt Abfrage verwendet

Wie kann ich in dieser Spalte unterschiedliche Bilder erhalten.

Ich versuchte mit TOP 1 ... ORDER BY NEWID(), aber es funktioniert nicht.

+1

Bitte vermeiden Sie irrelevante Tags. Finden Sie heraus, mit welcher Version von sql Server Sie arbeiten, und entfernen Sie alle anderen Versionstags. –

+1

'ORDER BY NEWID()' ist die übliche Methode, um 'zufällige' Reihenfolge zu erhalten; zeige also ein kleines, testbares Beispiel, wie du es verwendest und wie es "nicht funktioniert" Dann bekommst du eher schnelle Hilfe –

+0

Ich habe versucht entweder mit rand() oder newid() in Reihenfolge nach Klausel, aber ich habe nicht t verschiedene Bilder in meiner Hauptabfrage – StackUser

Antwort

1
SELECT TOP(1) t.LinkURL 
FROM dbo.ProductTypesPblmSolutions t 
WHERE t.ProductTypeId = PT.ID 
    AND t.LinkType = 1 
ORDER BY NEWID(), PT.ID -- additional calculation 

Beispiel # 1:

SELECT TOP(10) s.number, (
    SELECT TOP(1) s1.number 
    FROM [master].dbo.spt_values s1 
    WHERE s1.[type] = s.[type] 
    ORDER BY NEWID() 
) 
FROM [master].dbo.spt_values s 
WHERE s.[type] = 'P' 

Output:

----------- ----------- 
0   844 
1   844 
2   844 
3   844 
4   844 
5   844 
6   844 
7   844 
8   844 
9   844 

Beispiel # 2:

SELECT TOP(10) s.number, (
    SELECT TOP(1) s1.number 
    FROM [master].dbo.spt_values s1 
    WHERE s1.[type] = s.[type] 
    ORDER BY NEWID(), s.[type] -- <<<< additional calculation 
) 
FROM [master].dbo.spt_values s 
WHERE s.[type] = 'P' 

Output:

----------- ----------- 
0   428 
1   801 
2   550 
3   1619 
4   178 
5   17 
6   1702 
7   683 
8   352 
9   1844 
+0

Ich habe schon so versucht, aber ich bekomme die gleichen Werte in dieser Spalte – StackUser

+0

@NewUser überprüfen Sie meine Beispiele :) – Devart

2

Nur klar zu sein, sollte die Unterabfrage wie folgt aussehen:

  (SELECT TOP 1 ptps2.LinkURL 
      FROM ProductTypesPblmSolutions ptps2 
      WHERE ptps2.ProductTypeId = PT.Id AND 
        ptps2.LinkType = 1 
      ORDER BY NEWID() 
      ) 

Beachten Sie die Verwendung von qualifizierten Spaltennamen und die NEWID() im ORDER BY.

Ich empfehle immer qualifizierte Spaltennamen zu verwenden. Dies ist insbesondere True in korrelierten Unterabfragen, wo Fehler leicht zu machen und sehr schwierig zu finden sind (obwohl das in diesem speziellen Fall nicht das Problem sein könnte).

Wenn Sie davon keinen Effekt sehen, würde ich annehmen, dass die else Komponente der case ausgeführt wird, anstatt die Unterabfrage.

+0

Ich habe es versucht, aber ich bekomme die gleichen Werte für diese zwei Zeilen – StackUser

+2

Dann wird die Unterabfrage wahrscheinlich nicht ausgeführt, und Sie erhalten den "else" -Wert. –

+0

Ich habe mir in den letzten paar Stunden die Köpfe geschlagen, um das erwartete Ergebnis in diesem Unterabfrageteil zu bekommen, aber nichts funktioniert für mich. Bitte sehen Sie meine zweite Beispieldaten für Ihre Referenz – StackUser