언제 이너 조인에 크로스 적용을 사용해야 하나요?
CROSS APPLY를 사용하는 주된 목적은 무엇입니까?
를 통해).cross apply
파티션을 분할할 경우 대용량 데이터 세트를 선택할 때 더 효율적입니다.(페이징이 생각납니다)
도 .CROSS APPLY
UDF를 사용하다
★★★★★★★★★★ ★★★★INNER JOIN
관계 「(1 대 다의 관계)」로 쓸 수 .CROSS APPLY
하지만 항상 같은 실행 계획을 알려줘요
언제가 주실 수?CROSS APPLY
그런 경우에 차이를 만들 수 있습니다.INNER JOIN
★★★★★★★★★★★★★★★★★★?
편집:
보여주세요.cross apply
)를 합니다.
create table Company (
companyId int identity(1,1)
, companyName varchar(100)
, zipcode varchar(10)
, constraint PK_Company primary key (companyId)
)
GO
create table Person (
personId int identity(1,1)
, personName varchar(100)
, companyId int
, constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
, constraint PK_Person primary key (personId)
)
GO
insert Company
select 'ABC Company', '19808' union
select 'XYZ Company', '08534' union
select '123 Company', '10016'
insert Person
select 'Alan', 1 union
select 'Bobby', 1 union
select 'Chris', 1 union
select 'Xavier', 2 union
select 'Yoshi', 2 union
select 'Zambrano', 2 union
select 'Player 1', 3 union
select 'Player 2', 3 union
select 'Player 3', 3
/* using CROSS APPLY */
select *
from Person p
cross apply (
select *
from Company c
where p.companyid = c.companyId
) Czip
/* the equivalent query using INNER JOIN */
select *
from Person p
inner join Company c on p.companyid = c.companyId
INSER JOIN도 사용할 수 있는 경우 CROSS APPLY가 언제 다른지 좋은 예를 들어 주시겠습니까?
성능 비교에 대한 자세한 내용은 블로그 기사를 참조하십시오.
CROSS APPLY
것이 이 더 JOIN
★★★★★★ 。
은 " " " 를 선택합니다.3
회회 records records의 t2
기기다 from from의 각 t1
:
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
은 쉽게 할 수 .INNER JOIN
★★★★★★ 。
건 '어디서'를 통해서도 할 수 거예요.CTE
창 설정:
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
단, 읽기 어렵고 효율이 떨어질 수 있습니다.
업데이트:
방금 확인했어요.
master
is is is is표 is is is is is is 。20,000,000
기록PRIMARY KEY
id
.
다음 쿼리:
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
),
t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
JOIN q
ON q.rn <= t.id
달리다30
초수를 지정합니다.
WITH t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
CROSS APPLY
(
SELECT TOP (t.id) m.*
FROM master m
ORDER BY
id
) q
순간적입니다.
테이블이 두 개라고 생각해 보세요.
마스터 탭LE
x------x--------------------x
| Id | Name |
x------x--------------------x
| 1 | A |
| 2 | B |
| 3 | C |
x------x--------------------x
상세표
x------x--------------------x-------x
| Id | PERIOD | QTY |
x------x--------------------x-------x
| 1 | 2014-01-13 | 10 |
| 1 | 2014-01-11 | 15 |
| 1 | 2014-01-12 | 20 |
| 2 | 2014-01-06 | 30 |
| 2 | 2014-01-08 | 40 |
x------x--------------------x-------x
해야 할 .INNER JOIN
CROSS APPLY
을 으로 두 합니다.TOP n
가 달라지다
Consider if we need to select 선택할 필요가 있는 경우 고려합니다.Id
★★★★★★★★★★★★★★★★★」Name
부에서Master
and last two dates for each 그리고 마지막 두 데이트는Id
부에서Details table
.
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
INNER JOIN
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID
위의 쿼리는 다음 결과를 생성합니다.
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
x------x---------x--------------x-------x
세 지난 두 날짜의 마지막 두 날짜의 난 짜 과 한 성 를 생 see, two two다결니 it' for last generated with date dates resultss대습날했두,보Id
and then joined these records only in the outer query on 외부 쿼리에서만 이 레코드에 참여했습니다.Id
, - 그렇죠 - 기초부터 시작하자그건 잘못된 거야 This should be returning both 이것은 둘 다 반환해야 합니다.Ids
1과 2는 마지막 2개의 날짜가 있기 때문에 1만 반환되었습니다. 위해서는 '아까다', '아까다'를 해야 합니다.CROSS APPLY
.
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
CROSS APPLY
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
WHERE M.ID=D.ID
ORDER BY CAST(PERIOD AS DATE)DESC
)D
그리고 다음과 같은 결과를 형성합니다.
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-08 | 40 |
| 2 | B | 2014-01-06 | 30 |
x------x---------x--------------x-------x
이걸 어떻게 하는지 보여줄게. " " " "CROSS APPLY
할 수 .여기서 에서는, 을 참조할 수 있습니다.INNER JOIN
이 처리를 할 수 없습니다(컴파일 에러가 발생합니다).두 .CROSS APPLY
,,WHERE M.ID=D.ID
할 때 2. 필요할 때INNER JOIN
기능을 사용할 수 있습니다.
CROSS APPLY
쓸 수 INNER JOIN
를 때Master
과 테이블function
.
SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
CROSS APPLY dbo.FnGetQty(M.ID) C
그리고 여기 기능이 있습니다.
CREATE FUNCTION FnGetQty
(
@Id INT
)
RETURNS TABLE
AS
RETURN
(
SELECT ID,PERIOD,QTY
FROM DETAILS
WHERE ID=@Id
)
그것은 다음과 같은 결과를 낳았다.
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-11 | 15 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-06 | 30 |
| 2 | B | 2014-01-08 | 40 |
x------x---------x--------------x-------x
크로스 어플리케이션의 추가 장점
APPLY
쓸 수 UNPIVOT
둘 중 하나.어느 하나CROSS APPLY
★★★★★★★★★★★★★★★★★」OUTER APPLY
여기서 사용할 수 있습니다.이치노
해 보세요.MYTABLE
를 참조해 주세요.
x------x-------------x--------------x
| Id | FROMDATE | TODATE |
x------x-------------x--------------x
| 1 | 2014-01-11 | 2014-01-13 |
| 1 | 2014-02-23 | 2014-02-27 |
| 2 | 2014-05-06 | 2014-05-30 |
| 3 | NULL | NULL |
x------x-------------x--------------x
쿼리는 다음과 같습니다.
SELECT DISTINCT ID,DATES
FROM MYTABLE
CROSS APPLY(VALUES (FROMDATE),(TODATE))
COLUMNNAMES(DATES)
그 결과가 너에게 온다.
x------x-------------x
| Id | DATES |
x------x-------------x
| 1 | 2014-01-11 |
| 1 | 2014-01-13 |
| 1 | 2014-02-23 |
| 1 | 2014-02-27 |
| 2 | 2014-05-06 |
| 2 | 2014-05-30 |
| 3 | NULL |
x------x-------------x
cross apply
하면 할 수을 할 수 .inner join
.
예(구문 오류):
select F.* from sys.objects O
inner join dbo.myTableFun(O.name) F
on F.schema_id= O.schema_id
이것은 구문 오류입니다. 왜냐하면inner join
테이블 함수는 변수 또는 상수만 매개 변수로 사용할 수 있습니다(즉, 테이블 함수 매개 변수는 다른 테이블의 열에 의존할 수 없습니다).
단,
select F.* from sys.objects O
cross apply ( select * from dbo.myTableFun(O.name) ) F
where F.schema_id= O.schema_id
이건 합법이에요.
편집: 또는 구문 단축: (ErikE에 의한)
select F.* from sys.objects O
cross apply dbo.myTableFun(O.name) F
where F.schema_id= O.schema_id
편집:
주의: Informix 12.10 xC2+에는 Lateral Derivated Tables가 있고 Postgresql(9.3+)에는 Lateral Subqueries가 있어 동일한 효과를 얻을 수 있습니다.
복잡한 쿼리/내포 쿼리에서 계산된 필드를 작업할 때 CROSS APPLY가 일정한 공백을 메우고 보다 단순하고 읽기 쉽게 만들 수 있다고 생각합니다.
간단한 예: DoB를 가지고 있으며 최종 사용자 애플리케이션(Excel PivotTables 등)에서 사용하기 위해 Age, AgeGroup, AgeAtHiring, MinimumRetirementDate 등 다른 데이터 소스(고용 등)에 의존하는 여러 에이징 관련 필드를 제공하고자 합니다.
옵션은 한정되어 있어 우아한 경우는 거의 없습니다.
JOIN 하위 쿼리는 상위 쿼리의 데이터를 기반으로 데이터 집합에 새 값을 추가할 수 없습니다(자체여야 함).
UDF는 깔끔하지만 병렬 동작을 방해하는 경향이 있기 때문에 느립니다.또, 독립된 실체가 되는 것은, 좋은 것(코드가 적은 것)도 나쁜 것(코드가 있는 곳)도 있습니다.
접속 테이블때때로 그들은 일을 할 수 있지만, 곧 당신은 수많은 유니온들과 서브쿼리에 합류하게 될 것이다.엉망진창이군.
주 쿼리를 통해 중간에서 얻은 데이터가 계산에 필요하지 않다고 가정할 때 다른 단일 목적 보기를 만듭니다.
중간 테이블네... 보통 이 방법은 효과적입니다.인덱스화 및 고속화가 가능하기 때문에 좋은 옵션도 많지만 UPDATE 문이 병렬화되지 않고 같은 문 내의 여러 필드를 업데이트하기 위해 수식(재사용 결과)을 계단식으로 사용할 수 없기 때문에 성능도 저하될 수 있습니다.그리고 가끔은 한 번에 하는 걸 선호할 때도 있어요
쿼리를 네스트하고 있습니다.예. 언제든지 전체 쿼리에 괄호를 넣고 소스 데이터와 계산된 필드를 동일하게 조작할 수 있는 하위 쿼리로 사용할 수 있습니다.하지만 상황이 나빠지기 전에 이 정도밖에 할 수 없어.너무 못생겼어.
반복 코드3 long의 최대값은 얼마입니까(CASE...)ELSE...END) 스테이트먼트읽을 만하겠네!
- 고객들한테 직접 계산하라고 해
가가뭔 ?가 ?? ????그럴지도 모르니까 자유롭게 말씀해주세요. 적용: 크로스 적용: 간단한 .CROSS APPLY (select tbl.value + 1 as someFormula) as crossTbl
이제 소스 데이터에 항상 존재했던 것처럼 새 필드를 실질적으로 사용할 수 있습니다.
CROSS APPLY를 통해 소개된 값은 다음과 같습니다.
- 성능, 복잡성 또는 가독성 문제를 혼합에 추가하지 않고 하나 또는 여러 개의 계산된 필드를 작성하기 위해 사용됩니다.
- JOIN과 로 몇 가지 APPLY 도 자신을 참조할 수 .JOIN은 CROSS APPLY 스테이트먼트입니다.
CROSS APPLY (select crossTbl.someFormula + 1 as someMoreFormula) as crossTbl2
- 이후 조인 조건에서 CROSS APPLY에 의해 도입된 값을 사용할 수 있습니다.
- 또한 테이블 밸류 기능 측면도 있습니다.
젠장, 못 할 건 없어!
이는 이미 기술적으로 매우 잘 해결되었지만, 이것이 어떻게 매우 유용한지에 대한 구체적인 예를 들어 보겠습니다.
고객 테이블과 주문 테이블이 두 개 있다고 가정합니다.고객님의 주문이 많습니다.
고객에 대한 세부사항과 고객이 최근에 주문한 내용을 보여주는 뷰를 만들고 싶습니다.JOINS만 있으면 일부 자체 가입 및 집약이 필요하지만 그다지 예쁘지는 않습니다.그러나 Cross Apply를 사용하면 매우 간단합니다.
SELECT *
FROM Customer
CROSS APPLY (
SELECT TOP 1 *
FROM Order
WHERE Order.CustomerId = Customer.CustomerId
ORDER BY OrderDate DESC
) T
교차 적용은 XML 필드에서도 잘 작동합니다.노드 값을 다른 필드와 조합하여 선택하는 경우.
예를 들어 xml이 포함된 테이블이 있는 경우
<root> <subnode1> <some_node value="1" /> <some_node value="2" /> <some_node value="3" /> <some_node value="4" /> </subnode1> </root>
조회 사용
SELECT
id as [xt_id]
,xmlfield.value('(/root/@attribute)[1]', 'varchar(50)') root_attribute_value
,node_attribute_value = [some_node].value('@value', 'int')
,lt.lt_name
FROM dbo.table_with_xml xt
CROSS APPLY xmlfield.nodes('/root/subnode1/some_node') as g ([some_node])
LEFT OUTER JOIN dbo.lookup_table lt
ON [some_node].value('@value', 'int') = lt.lt_id
결과를 반환합니다.
xt_id root_attribute_value node_attribute_value lt_name
----------------------------------------------------------------------
1 test1 1 Benefits
1 test1 4 FINRPTCOMPANY
교차 적용을 사용하여 하위 쿼리의 열이 필요한 하위 쿼리를 바꿀 수 있습니다.
서브쿼리
select * from person p where
p.companyId in(select c.companyId from company c where c.companyname like '%yyy%')
여기서는 회사 테이블의 열을 선택할 수 없기 때문에 교차 적용을 사용합니다.
select P.*,T.CompanyName
from Person p
cross apply (
select *
from Company C
where p.companyid = c.companyId and c.CompanyName like '%yyy%'
) T
간단한 이 튜토리얼은.sql
및 의 기억을 에서 수행되었습니다.CROSS APPLY
및: 사용 방법:
-- Here's the key to understanding CROSS APPLY: despite the totally different name, think of it as being like an advanced 'basic join'.
-- A 'basic join' gives the Cartesian product of the rows in the tables on both sides of the join: all rows on the left joined with all rows on the right.
-- The formal name of this join in SQL is a CROSS JOIN. You now start to understand why they named the operator CROSS APPLY.
-- Given the following (very) simple tables and data:
CREATE TABLE #TempStrings ([SomeString] [nvarchar](10) NOT NULL);
CREATE TABLE #TempNumbers ([SomeNumber] [int] NOT NULL);
CREATE TABLE #TempNumbers2 ([SomeNumber] [int] NOT NULL);
INSERT INTO #TempStrings VALUES ('111'); INSERT INTO #TempStrings VALUES ('222');
INSERT INTO #TempNumbers VALUES (111); INSERT INTO #TempNumbers VALUES (222);
INSERT INTO #TempNumbers2 VALUES (111); INSERT INTO #TempNumbers2 VALUES (222); INSERT INTO #TempNumbers2 VALUES (222);
-- Basic join is like CROSS APPLY; 2 rows on each side gives us an output of 4 rows, but 2 rows on the left and 0 on the right gives us an output of 0 rows:
SELECT
st.SomeString, nbr.SomeNumber
FROM -- Basic join ('CROSS JOIN')
#TempStrings st, #TempNumbers nbr
-- Note: this also works:
--#TempStrings st CROSS JOIN #TempNumbers nbr
-- Basic join can be used to achieve the functionality of INNER JOIN by first generating all row combinations and then whittling them down with a WHERE clause:
SELECT
st.SomeString, nbr.SomeNumber
FROM -- Basic join ('CROSS JOIN')
#TempStrings st, #TempNumbers nbr
WHERE
st.SomeString = nbr.SomeNumber
-- However, for increased readability, the SQL standard introduced the INNER JOIN ... ON syntax for increased clarity; it brings the columns that two tables are
-- being joined on next to the JOIN clause, rather than having them later on in the WHERE clause. When multiple tables are being joined together, this makes it
-- much easier to read which columns are being joined on which tables; but make no mistake, the following syntax is *semantically identical* to the above syntax:
SELECT
st.SomeString, nbr.SomeNumber
FROM -- Inner join
#TempStrings st INNER JOIN #TempNumbers nbr ON st.SomeString = nbr.SomeNumber
-- Because CROSS APPLY is generally used with a subquery, the subquery's WHERE clause will appear next to the join clause (CROSS APPLY), much like the aforementioned
-- 'ON' keyword appears next to the INNER JOIN clause. In this sense, then, CROSS APPLY combined with a subquery that has a WHERE clause is like an INNER JOIN with
-- an ON keyword, but more powerful because it can be used with subqueries (or table-valued functions, where said WHERE clause can be hidden inside the function).
SELECT
st.SomeString, nbr.SomeNumber
FROM
#TempStrings st CROSS APPLY (SELECT * FROM #TempNumbers tempNbr WHERE st.SomeString = tempNbr.SomeNumber) nbr
-- CROSS APPLY joins in the same way as a CROSS JOIN, but what is joined can be a subquery or table-valued function. You'll still get 0 rows of output if
-- there are 0 rows on either side, and in this sense it's like an INNER JOIN:
SELECT
st.SomeString, nbr.SomeNumber
FROM
#TempStrings st CROSS APPLY (SELECT * FROM #TempNumbers tempNbr WHERE 1 = 2) nbr
-- OUTER APPLY is like CROSS APPLY, except that if one side of the join has 0 rows, you'll get the values of the side that has rows, with NULL values for
-- the other side's columns. In this sense it's like a FULL OUTER JOIN:
SELECT
st.SomeString, nbr.SomeNumber
FROM
#TempStrings st OUTER APPLY (SELECT * FROM #TempNumbers tempNbr WHERE 1 = 2) nbr
-- One thing CROSS APPLY makes it easy to do is to use a subquery where you would usually have to use GROUP BY with aggregate functions in the SELECT list.
-- In the following example, we can get an aggregate of string values from a second table based on matching one of its columns with a value from the first
-- table - something that would have had to be done in the ON clause of the LEFT JOIN - but because we're now using a subquery thanks to CROSS APPLY, we
-- don't need to worry about GROUP BY in the main query and so we don't have to put all the SELECT values inside an aggregate function like MIN().
SELECT
st.SomeString, nbr.SomeNumbers
FROM
#TempStrings st CROSS APPLY (SELECT SomeNumbers = STRING_AGG(tempNbr.SomeNumber, ', ') FROM #TempNumbers2 tempNbr WHERE st.SomeString = tempNbr.SomeNumber) nbr
-- ^ First the subquery is whittled down with the WHERE clause, then the aggregate function is applied with no GROUP BY clause; this means all rows are
-- grouped into one, and the aggregate function aggregates them all, in this case building a comma-delimited string containing their values.
DROP TABLE #TempStrings;
DROP TABLE #TempNumbers;
DROP TABLE #TempNumbers2;
다음은 JOINs에 대한 성능 차이와 사용률을 모두 설명하는 기사입니다.
이 문서에서 제시된 바와 같이 일반 조인 동작(INNER 및 CROSS)에서는 이들 사이에 성능 차이는 없습니다.
다음과 같은 쿼리를 수행해야 하는 경우 사용률 차이가 발생합니다.
CREATE FUNCTION dbo.fn_GetAllEmployeeOfADepartment(@DeptID AS INT)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM Employee E
WHERE E.DepartmentID = @DeptID
)
GO
SELECT * FROM Department D
CROSS APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)
즉, 기능과 관련을 지어야 할 때 입니다.이 작업은 INSER JOIN을 사용하여 수행할 수 없습니다. 그러면 "The multi-part identifier "D" 오류가 발생합니다.부서ID"를 바인딩할 수 없습니다.여기서 각 행이 읽힐 때 값이 함수에 전달됩니다.멋질 것 같네요.:)
가독성이 있어야 합니다;)
왼쪽 표에서 각 행에 적용되는 UDF가 사용되고 있음을 알려주는 것은 읽는 사람에게 다소 독특합니다.
물론 위의 다른 친구들이 올린 JOIN보다 CROSS APPLY를 더 잘 사용할 수 있는 다른 제한 사항도 있습니다.
APPLY 연산자의 본질은 FROM 절에서 연산자의 왼쪽과 오른쪽 사이의 상관관계를 허용하는 것입니다.
JOIN과 달리 입력 간의 상관 관계는 허용되지 않습니다.
APPLY 연산자의 상관관계에 대해 말하자면, 오른쪽에 다음과 같이 표시할 수 있습니다.
- 파생 테이블 - 별칭과 관련된 하위 쿼리
- 테이블 값 함수 - 매개변수가 왼쪽을 참조할 수 있는 개념 뷰
둘 다 여러 열과 행을 반환할 수 있습니다.
이것이 Cross Apply와 Inner Join을 사용하는 이유로 적합한지는 잘 모르겠습니다만, 이 쿼리는 Cross Apply를 사용하여 포럼 포스트에서 응답되었기 때문에 Inner Join을 사용하는 동등한 방법이 있는지 모르겠습니다.
Create PROCEDURE [dbo].[Message_FindHighestMatches]
-- Declare the Topical Neighborhood
@TopicalNeighborhood nchar(255)
처음에
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON
Create table #temp
(
MessageID int,
Subjects nchar(255),
SubjectsCount int
)
Insert into #temp Select MessageID, Subjects, SubjectsCount From Message
Select Top 20 MessageID, Subjects, SubjectsCount,
(t.cnt * 100)/t3.inputvalues as MatchPercentage
From #temp
cross apply (select count(*) as cnt from dbo.Split(Subjects,',') as t1
join dbo.Split(@TopicalNeighborhood,',') as t2
on t1.value = t2.value) as t
cross apply (select count(*) as inputValues from dbo.Split(@TopicalNeighborhood,',')) as t3
Order By MatchPercentage desc
drop table #temp
끝.
이것은 아마도 오래된 질문일 것입니다만, 저는 여전히 CROSS APPLY가 논리의 재사용을 심플화하고, 결과의 「체인」메커니즘을 제공하는 힘을 좋아합니다.
아래 SQL Fielen은 CROSS APPLY를 사용하여 복잡한 논리 조작을 데이터 세트에 대해 전혀 복잡하지 않게 수행할 수 있는 간단한 예를 보여 줍니다.여기서부터 더 복잡한 계산을 추론하는 것은 어렵지 않다.
http://sqlfiddle.com/#!3/23862/2
CROSS APPLY를 사용하는 대부분의 쿼리는 INSER JOIN을 사용하여 다시 작성할 수 있지만, CROSS APPLY는 조인 전에 조인되는 세트를 제한할 수 있기 때문에 더 나은 실행 계획과 더 나은 성능을 얻을 수 있습니다.
여기서 도난당하다
다른 (업데이트 요청) 테이블에서 JSON을 사용하여 테이블을 업데이트하기 위해 CROSS APPLY를 사용합니다.JOPENJSON은 JSON의 내용을 읽기 위해 사용되며 OPENJSON은 "테이블 값 함수"이기 때문에 조인 기능은 작동하지 않습니다.
여기에서는 UPDATE 명령어 중 하나를 예로 들어 설명하려고 했는데, 단순화된 명령어 중 하나를 예로 들어보면 상당히 크고 복잡합니다.따라서 명령어의 일부만 간단히 "스케치"하면 충분합니다.
SELECT
r.UserRequestId,
j.xxxx AS xxxx,
FROM RequestTable as r WITH (NOLOCK)
CROSS APPLY
OPENJSON(r.JSON, '$.requesttype.recordtype')
WITH(
r.userrequestid nvarchar(50) '$.userrequestid',
j.xxx nvarchar(20) '$.xxx
)j
WHERE r.Id > @MaxRequestId
and ... etc. ....
언급URL : https://stackoverflow.com/questions/1139160/when-should-i-use-cross-apply-over-inner-join
'programing' 카테고리의 다른 글
SQL Server에서 외부 키를 드롭하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
---|---|
SSMS 2008의 "Edit Top 200 Rows"에서 SQL을 변경하는 방법 (0) | 2023.04.07 |
SQL Server에서 JOIN을 사용하여 UPDATE 문을 실행하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
SQL Server 값 목록에서 선택하는 방법 (0) | 2023.04.07 |
SQL Server에서의 내부 참여와 왼쪽 참여의 퍼포먼스 (0) | 2023.04.07 |