0

有带有值的表 myTbl

ID  Number
1    12458
2    45896  
3    12458
4    87456

有这样的查询:

SELECT TOP 1 n.abonent_name , ad.address
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id
WHERE n.number = (every number from myTbl)

想要将 myTbl 中的每个数字插入查询Where 子句,然后将每个数字的响应插入到虚拟表#tbl例如插入到 #tbl abonent_name 和地址 where number = 12458,在此插入之后,在 where 子句中写入另一个数字 45896 然后插入#tbl 等

CREATE TABLE #tbl
(
   id identity(1,1),
   abonent_name varchar(20),
   address varchar(50)
)

想写没有光标

4

2 回答 2

1
SELECT TOP 1 n.abonent_name , ad.address
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id
WHERE n.number IN (SELECT number from myTbl)

试试上面。但是你可以通过执行以下操作用一块石头杀死两只鸟

SELECT  ROW_NUMBER() OVER (order by n.abonent_name) AS ID, n.abonent_name , ad.address
INTO #tbl
FROM dbo.names n 
INNER JOIN dbo.addresses ad on n.address_id = ad.id
WHERE n.number IN (SELECT number from myTbl)
于 2013-10-29T08:04:27.083 回答
0

您不需要使用光标。如果addresses表中每个名称的行数超过 1 行,则可以使用以下模式:

INSERT INTO #tbl (abonent_name, address)
SELECT x.abonent_name, x.address
from
(
    SELECT
      ROW_NUMBER() OVER (PARTITION BY n.abonent_name
                         ORDER BY n.abonent_name, x.address) AS RowNumber,
      n.abonent_name,
      ad.address
    FROM dbo.names n 
    INNER JOIN myTbl tbl on n.number = tbl.number
    INNER JOIN dbo.addresses ad on n.address_id = ad.id
) x
where x.RowNumber = 1
order by x.RowNumber;

此代码将在表中插入#tbl每个名称的第一个(字母顺序)地址,该代码存在于myTbl表中。名称将按字母升序排序。条件x.RowNumber=1将在多个匹配的情况下过滤第一个地址。

于 2013-10-29T08:36:56.693 回答