我需要一种方法在SQL Server中的变量中传递SELECT-Statement中的值,因为在过程返回结果之前我有很多检查。
首先,我有一个SELECT语句,用于检查ID' US'中是否包含ID。
// 1. check:
SELECT
g.artID
FROM
dbo.G_FID g
INNER JOIN
dbo.MasterData s
ON
g.WKN = s.WKN
WHERE
s.ID <> "US"
他们不在artID
中的所有US
- 该组将检查下一个SELECT语句:
// 2. check:
SELECT
g.artID
FROM
dbo.G_FID g
WHERE
(g.FID='68A')
OR
(g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
此检查的结果将继续进行下一次检查,依此类推。 有谁能举个例子来说明如何处理这个问题?
答案 0 :(得分:2)
您可以创建一个包含该项和状态列的临时表。在您的程序的每个阶段,您可以修改状态,以便在完成所有检查后您知道您真正感兴趣的项目。您的第一个查询将是所有内容的列表&lt;&gt;具有空状态的US(可能)您的第二个查询可能会将状态设置为1(true / required)等。
/*
CREATE TABLE G_FID
(ARTID INT, WKN INT, FID VARCHAR(3), VALUE VARCHAR(2))
CREATE TABLE MASTERDATA
(ID VARCHAR(2), WKN INT)
*/
truncate table g_fid
INSERT INTO G_FID VALUES
(1,1,'1','04'),(2,1,'68A','04'),(3,1,'73','04'),(4,2,'68A','04'),(5,2,'73','04')
TRUNCATE TABLE MASTERDATA
INSERT INTO MASTERDATA VALUES
('UK',1),('US',2)
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
SELECT
g.artID,g.WKN,g.FID,g.VALUE,s.ID,s.wkn as s_wkn,NULL AS STATUS
INTO #TEMP
FROM
dbo.G_FID g
INNER JOIN
dbo.MasterData s
ON
g.WKN = s.WKN
WHERE
s.ID <> 'US'
SELECT * FROM #TEMP
UPDATE #TEMP
SET STATUS = 1 WHERE #TEMP.ARTID IN(
SELECT
g.artID
FROM
dbo.G_FID g
WHERE
(g.FID='68A')
OR
(g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
)
SELECT * FROM #TEMP
----------- ----------- ---- ----- ---- ----------- -----------
1 1 1 04 UK 1 NULL
2 1 68A 04 UK 1 NULL
3 1 73 04 UK 1 NULL
(3 row(s) affected)
(2 row(s) affected)
artID WKN FID VALUE ID s_wkn STATUS
----------- ----------- ---- ----- ---- ----------- -----------
1 1 1 04 UK 1 NULL
2 1 68A 04 UK 1 1
3 1 73 04 UK 1 1
(3 row(s) affected)
答案 1 :(得分:1)
如果您不喜欢子查询,可以使用Common table expressions
with G_FID_CTE
as
(
SELECT *
FROM dbo.G_FID g
INNER JOIN dbo.MasterData s
ON g.WKN = s.WKN
WHERE s.ID <> "US"
)
SELECT g.artID
FROM G_FID_CTE g
WHERE (g.FID='68A')
OR (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
使用多个:
--first
with G_FID_CTE
as
(
SELECT *
FROM dbo.G_FID g
INNER JOIN dbo.MasterData s
ON g.WKN = s.WKN
WHERE s.ID <> "US"
),
--second
with G_FID_CTE2
as
(
SELECT *
FROM G_FID_CTE g
WHERE <some_expression>
)
SELECT g.artID
FROM G_FID_CTE2 g
WHERE (g.FID='68A')
OR (g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
答案 2 :(得分:0)
您可以将查询包装为子查询。所以意味着你的SQL语句以你想要的最终结果开始,你根据子查询的结果来做。
SELECT
g.artID
FROM
(SELECT
g.artID
FROM
dbo.G_FID g
INNER JOIN
dbo.MasterData s
ON
g.WKN = s.WKN
WHERE
s.ID <> "US")
WHERE
(g.FID='68A')
OR
(g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
答案 3 :(得分:0)
你可以在join clausule中使用条件...例如:
SELECT
g.artID,
FROM dbo.G_FID g
JOIN dbo.MasterData s ON g.WKN = s.WKN AND
s.ID <> 'US'
WHERE (g.FID='68A') OR
(g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))
另外,您也可以使用临时表,如:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
SELECT
g.artID,
g.FID,
g.VALUE
INTO #tmp
FROM dbo.G_FID g
JOIN dbo.MasterData s ON g.WKN = s.WKN
WHERE s.ID <> 'US'
SELECT
g.artID
FROM
#tmp g
WHERE
(g.FID='68A')
OR
(g.FID='73' AND g.VALUE IN ('04', '07', '09', '11', '13', '14', '15'))