Вычисляем столбец в неправильном положении при использовании `SELECT *` - PullRequest
1 голос
/ 08 июля 2011

Рассмотрим этот запрос, который использует SELECT * и «добавляет» вычисляемый столбец:

SELECT *, 
       IIF(TRUE, 1, 0) AS calculated_col
  FROM Orders;

Я бы ожидал, что calculated_col будет самым правым столбцом в наборе результатов.Однако на самом деле это самый левый столбец.Это самый правый вариант при выполнении эквивалентного запроса в SQL Server, например.

Теперь, поскольку это Access (ACE, Jet, что угодно), стандарты SQL не применяются, и в справке Access не будет указаноожидаемый результат, потому что это не достаточно подробно (вежливо).Поэтому у меня следующие вопросы:

Всегда ли Access вел себя таким образом или это «особенность» моей среды (ADO, поставщик OLE DB и т. Д.)?

Всегда ли Access вел себя таким образом вданная среда?(т.е. почему я не заметил этого раньше?)

PS Я знаю, конечно, что SELECT * широко высмеивается и что, если порядок столбцов важен для меня, тогда я должен записать их все явно.Тем не менее, я был искренне удивлен фактическим поведением и заинтересован в любых ответах на мои вопросы.

Вот некоторые VBA для воспроизведения поведения: просто скопируйте + вставьте в любой модуль VBA, никаких ссылок не нужно устанавливатьи Access не нужно устанавливать, например, используйте редактор VBA в Excel:

Sub ColumnOrderWrong()

  On Error Resume Next
  Kill Environ$("temp") & "\DropMe.mdb"
  On Error GoTo 0

  Dim cat
  Set cat = CreateObject("ADOX.Catalog")
  With cat
    .Create _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & _
        Environ$("temp") & "\DropMe.mdb"
    With .ActiveConnection

      Dim Sql As String
      Sql = _
      "CREATE TABLE Orders" & vbCr & _
      "(" & vbCr & " ID INTEGER, " & vbCr & _
      " customer_id" & _
      " INTEGER" & vbCr & _
      ");"
      .Execute Sql

      Sql = _
      "INSERT INTO Orders (ID, customer_id) VALUES" & _
      " (1, 2);"
      .Execute Sql

      Sql = _
      "SELECT *, " & vbCr & _
      "       IIF(TRUE, 55, -99) AS calculated_col" & vbCr & _
      "  FROM Orders;"
      Dim rs
      Set rs = .Execute(Sql)

      MsgBox _
      "Fields(0).Name = " & rs.Fields(0).Name & vbCr & _
      "Fields(1).Name = " & rs.Fields(1).Name & vbCr & _
      "Fields(2).Name = " & rs.Fields(2).Name

    End With
    Set .ActiveConnection = Nothing
  End With
End Sub

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Измените свой оператор выбора на:

  Sql = _
       "SELECT Orders.*, " & vbCr & _
       "       IIF(TRUE, 55, -99) AS calculated_col" & vbCr & _
       "  FROM Orders;" 

Объявляя имя таблицы, я думаю, что это избавляет от необходимости определять, что является таблицей по умолчанию.

1 голос
/ 09 февраля 2012

Код SQL в вопросе запрещен стандартом SQL: когда * используется без точечной квалификации (без учета специального случая COUNT(*)), другие столбцы могут не отображаться.

Этодает подсказку к решению: точечно укажите * !!

, например, это работает, как ожидалось, с calculated_column, который отображается как самый правый столбец в результате:

SELECT Orders.*, 
       IIF(TRUE, 1, 0) AS calculated_col
  FROM Orders;
0 голосов
/ 08 июля 2011

Из проведенных вами расследований похоже, что вы набиты.

Возможно, вам придется ссылаться на столбцы набора записей по имени, а не по позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...