2010-07-06 3 views
2

SQL 전문가가 아니며 CTE에서 준결승자이기도합니다.이 쿼리 문은 SQL Server가 2000이므로 기본 쿼리 내에서 다음 하위 쿼리의 결과 집합을 사용하여 코딩 할 수 있습니다.T-SQL 중첩 된 서브 쿼리

declare @subcategoryConcatenate varchar(3999) 
set @subcategoryConcatenate = '' 

select @subcategoryConcatenate = @subcategoryConcatenate + pumpCategoryName + ',' FROM 
(SELECT 
      SCD.PUMPCATEGORYNAME, 
      SCD.ENGINECATEGORYNAME, 
      SCD.DETAILEDDESCRIPTION 
FROM PRTTICKHDR PHDR 
INNER JOIN BIDHDR BHDR ON PHDR.DELIV_TICKET_NUMBER = BHDR.DTICKET 
INNER JOIN PRTTICKITEM PITM ON PHDR.CONNECTION_ID = PITM.CONNECTION_ID AND PHDR.DELIV_TICKET_NUMBER = PITM.DELIV_TICKET_NUMBER 
LEFT JOIN SUBCATEGORYDESCRIPTION SCD ON PITM.ITEM = SCD.PUMPCATEGORY 
WHERE SCD.pumpCategoryName IS NOT NULL) 
subcategoryDescription 

select @subcategoryConcatenate 

SELECT 
      PHDR.CONNECTION_ID AS CONNECTION_ID, 
      BHDR.OFFICE AS OFFICE, 
      CMP.NAME AS DEPOT, 
      CMP.ADDR1 AS DEPOT_ADDR1, 
      CMP.ADDR2 AS DEPOT_ADDR2, 
      CMP.CITY AS DEPOT_CITY, 
      CMP.STATE AS DEPOT_STATE, 
      CMP.ZIP AS DEPOT_ZIP, 
      CMP.PHONENUM AS DEPOT_PHONE, 
      CMP.FAXNUM AS DEPOT_FAX, 
      ACT.NAME AS ACTIVITY, 
      SAL.SALES_PERSON_NAME AS SALESPERSON, 
      BHDR.DTICKET AS DELIV_TICKET_NUMBER, 
      BHDR.PO_NUMBER, 
      BHDR.CREATED AS CREATED_DATE, 
       BHDR.DDATE AS ESTIMATED_START_DATE, 
      BHDR.PROJ_STOP_DATE AS PROJECTED_STOP_DATE, 
      CUR.ID, 
      CUR.CODE, 
      CUR.EXCHANGE_RATE, 
      CST.TERMS, 
      BHDR.ORDBY AS ORDERED_BY, 
      PHDR.ORDERED_BY_CONTACT, 
      BHDR.ACCT AS ACCOUNT, 
      BHDR.NAME AS CUSTOMER, 
      BHDR.ADDR1 AS CUST_ADDR1, 
      BHDR.ADDR2 AS CUST_ADDR2, 
      BHDR.CITY AS CUST_CITY, 
      BHDR.STATE AS CUST_STATE, 
      BHDR.ZIP AS CUST_ZIP, 
      PHDR.SHIP_TO_NAME, 
      PHDR.SHIP_TO_ADDR1, 
      PHDR.SHIP_TO_ADDR2, 
      PHDR.SHIP_TO_CITY, 
      PHDR.SHIP_TO_STATE, 
      PHDR.SHIP_TO_ZIP, 
      PITM.PRINT_SEQUENCE, 
      PITM.ITEM, 
      PITM.SUBGROUP, 
      PITM.DESCRIPTION, 
      SCD.PUMPCATEGORYNAME, 
      SCD.ENGINECATEGORYNAME, 
      SCD.DETAILEDDESCRIPTION, 
      PITM.QUANTITY, 
      PITM.UNIT_OF_MEASURE, 
      PITM.BILLING_LOGIC_TYPE, 
      PITM.INVENTORY_TYPE, 
      PITM.CHARGEABLE_DAYS, 
      PITM.MINIMUM_CHARGE, 
      PITM.WEEKLY_CHARGE, 
      PITM.MONTHLY_CHARGE, 
      PITM.UNINVOICED_NET, 
      PITM.UNINVOICED_VAT 
FROM PRTTICKHDR PHDR 
INNER JOIN BIDHDR BHDR ON PHDR.DELIV_TICKET_NUMBER = BHDR.DTICKET 
INNER JOIN PRTTICKITEM PITM ON PHDR.CONNECTION_ID = PITM.CONNECTION_ID AND PHDR.DELIV_TICKET_NUMBER = PITM.DELIV_TICKET_NUMBER 
INNER JOIN COMPANY CMP ON BHDR.OFFICE = CMP.OFFICE 
LEFT JOIN SUBCATEGORYDESCRIPTION SCD ON PITM.ITEM = SCD.PUMPCATEGORY 
INNER JOIN ACTIVITIES ACT ON BHDR.ACTIVITY_ID = ACT.ID 
INNER JOIN SALES_PERSON SAL ON BHDR.SALES_PERSON = SAL.SALES_PERSON 
INNER JOIN CUSTOMERS CST ON BHDR.ACCT = CST.CUSTNUM 
INNER JOIN CURRENCY CUR ON CST.CURRENCY_ID = CUR.ID 
ORDER BY 
      BHDR.DTICKET, 
      PITM.PRINT_SEQUENCE 
ASC 

답변

4

SQL Server 2000은 열팽창 계수를 지원하지 않습니다.

select 
    .. stuff.. 
from 
    table1 t1 
    join table2 t2 on ...stuff... 
    join (
    select 
     ... 
    from 
     ... 
    where 
     ... 
) inline on ... stuff ... 
where 
    .... 
+0

모두 코드로 고투 내가 검색하는 기대 유도 :
는이 같은 것 사용! – ascomiller

+0

가능한 경우 맨 위 쿼리에 중첩 할 수 있습니까? – ascomiller

+0

아니요, 아마 UDF로 작성하는 것이 좋습니다. 하위 쿼리는 전체 배치가 아닌'select' 문만 가질 수 있습니다. – Donnie

0

당신은 사용자 정의 함수가 필요합니다 : 귀하의 옵션은 많이 사용되는 경우 하위 쿼리에서 뷰를 만들거나 인라인 뷰를 수행하는 중에있다.
모양에서 각각 PRTTICKITEM은 개 이상일 수 있습니다.

CREATE FUNCTION GetPumpCategoriesByItem (@ItemID int) 

    RETURNS varchar (8000) 
AS 
BEGIN 
    DECLARE 
     @CategoryList  varchar (8000) 
    SET @CategoryList  = NULL -- MUST be null to avoid leading comma. 

    SELECT 
     @CategoryList  = COALESCE (@CategoryList + ', ', '') + SCD.PUMPCATEGORYNAME 
    FROM 
     SUBCATEGORYDESCRIPTION SCD 
    WHERE 
     SCD.PUMPCATEGORY = @ItemID 
    ORDER BY 
     SCD.PUMPCATEGORYNAME 

    RETURN @CategoryList 
END 

:
가 (. 문제는 더 나은 원하는 결과를 설명 할 필요가있다)

를하는 경우, 사용자의 UDF는 다음과 같이 보일 것입니다.

SELECT 
    PITM.ITEM, 
    dbo.GetPumpCategoriesByItem (PITM.ITEM), 
    ... ... 
FROM 
    ... ... 
INNER JOIN PRTTICKITEM PITM ON ... ... 
... ...