-2

使用 select * 时是否有排除列?当然我可以只列出我想要的列,但是如果说我正在查询一个有 30 列的表并且我想要其中的 27 列,那么写一些类似的东西会更干净SELECT * EXCLUDE a, b, c

有没有办法做到这一点?

4

1 回答 1

0

这是生成选择列表并消除两个表中重复列的一种方法。它假定您已经知道这两个表以及它们之间的关系。这使用 AdventureWorks 和表 Sales.SalesOrderDetail 和 Sales.SalesOrderHeader。请注意,具有相同名称的多个表中的列不一定是冗余的 - 例如,可以独立于订单详细信息项目修改订单,现在您的查询 (a) 忽略详细级别修改日期,并且 (b) 不t 在结果中清楚地表明哪个修改日期已公开(除非用户阅读查询文本,如果他们有权访问它)。

DECLARE @sql nvarchar(max);

;WITH l AS 
(
  SELECT column_id, name FROM sys.columns 
  WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderDetail')
),
r AS
(
  SELECT column_id, name FROM sys.columns 
  WHERE [object_id] = OBJECT_ID(N'Sales.SalesOrderHeader')
)
SELECT @sql = STUFF((SELECT N',' + CHAR(13) + CHAR(10) + CHAR(9)
  + CASE WHEN l.column_id IS NOT NULL THEN 'h.' 
  ELSE 'd.' END + QUOTENAME(COALESCE(l.name,r.name)) FROM r 
FULL OUTER JOIN l 
ON l.name = r.name
ORDER BY COALESCE(l.column_id, 255), r.column_id
FOR XML PATH(''), 
TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'');

SELECT @sql = N'SELECT ' + @sql + ' 
  FROM Sales.SalesOrderHeader AS h
  INNER JOIN Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID;'

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

结果:

SELECT 
    h.[SalesOrderID],
    d.[SalesOrderDetailID],
    d.[CarrierTrackingNumber],
    d.[OrderQty],
    d.[ProductID],
    d.[SpecialOfferID],
    d.[UnitPrice],
    d.[UnitPriceDiscount],
    d.[LineTotal],
    h.[rowguid],
    h.[ModifiedDate],
    h.[RevisionNumber],
    h.[OrderDate],
    h.[DueDate],
    h.[ShipDate],
    h.[Status],
    h.[OnlineOrderFlag],
    h.[SalesOrderNumber],
    h.[PurchaseOrderNumber],
    h.[AccountNumber],
    h.[CustomerID],
    h.[SalesPersonID],
    h.[TerritoryID],
    h.[BillToAddressID],
    h.[ShipToAddressID],
    h.[ShipMethodID],
    h.[CreditCardID],
    h.[CreditCardApprovalCode],
    h.[CurrencyRateID],
    h.[SubTotal],
    h.[TaxAmt],
    h.[Freight],
    h.[TotalDue],
    h.[Comment] 
  FROM Sales.SalesOrderHeader AS h
  INNER JOIN Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID;
于 2013-04-11T18:31:37.840 回答