2012-02-02 18 views
2

グッドモーニングみんなここで行く、私はアクセス2010でクエリをやっていると私は奇妙な行動を取得していますので、私はあなたの意見を聞いてみたい:アクセス2010奇妙な行動

SELECT X.*, L.CodLinea 
FROM (
    SELECT TOP 1 'LBASE' AS CodLinea, 'Linea Base' AS Descrizione FROM ParametriAzienda 
) AS X LEFT JOIN Linee AS L 
ON X.CodLinea = L.CodLinea 

上記LBASE」に等しい値を持つL.CodLineaと呼ばれる別の列と行を返す必要がありますように、左が参加やって、今

CodLinea | Descrizione 
----------+-------------- 
    LBASE | Linea Base 

:内側のクエリは次のようになります2つのcolumsで常にONE行を与えますテーブルのLineeが 'LBASE'を内部に持っているかどうかに応じてNULLを返します。値が存在しない場合、値が存在する場合は

X.CodLinea | X.Descrizione | L.CodLinea 
+-------------+-----------------+--------------+ 
    LBASE  | Linea Base  | LBASE  

、または

X.CodLinea | X.Descrizione | L.CodLinea 
+-------------+-----------------+--------------+ 
    LBASE  | Linea Base  | null  

:だから、結果はすることができます。確かに私が得るものは次の通りです。

X.CodLinea | X.Descrizione | L.CodLinea 
+-------------+-----------------+--------------+ 
    LBASE  | Linea Base  | 0   
    LBASE  | Linea Base  | 0   
    LBASE  | Linea Base  | 0   
    LBASE  | Linea Base  | 0   
    LBASE  | Linea Base  | 0   

これは間違いなく可能です。 b)0はLBASEと等しくないか、そうでない。 LEFT JOIN(INNER JOINと同様)またはRIGHT JOINの代わりにWHEREを使用すると、結果は正しい(0行)。

何が問題になりますか?

EDIT:実際にはParametriAziendaには1行しかなく、LineeにはLBASE値が含まれていません。

+0

また、これはJet 4.0(.mdb)でテストされており、Access 2010もACE(.accdb)でも問題はありません。 – onedaywhen

答えて

1

問題はTOP 1です。その使用(コード内のバグ)が誤解されているか、エンジンのバグです。

個人的には、標準SQLであるので、私はいつもDISTINCTを使用して(と私はその使用を理解し:)私はこれをテストしたときに実際に、DISTINCTTOP 1を交換すると期待される結果にあなたの実際の結果になります。

私のreproです。以下のVBAは、テンポラリフォルダに新しいデータファイルを作成します。テーブルとサンプルデータがあります。参照は必要ありません。単にVBAモジュールにVBAモジュールをコピー&ペーストします。 Excelを使用する:

Sub NotTop1() 

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

    Dim cat 
    Set cat = CreateObject("ADOX.Catalog") 

    With cat 
    .Create _ 
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
     "Data Source=" & _ 
     Environ$("temp") & "\DropMe.accdb" 

    With .ActiveConnection 

     Dim Sql As String 

     Sql = _ 
     "CREATE TABLE ParametriAzienda (x INTEGER NOT NULL);" 
     .Execute Sql 

     Sql = _ 
     "INSERT INTO ParametriAzienda (x) VALUES (1);" 
     .Execute Sql 

     Sql = _ 
     "CREATE TABLE Linee (CodLinea CHAR(1) NOT NULL);" 
     .Execute Sql 

     Dim i As Long 
     For i = 0 To 4 
     Sql = _ 
     "INSERT INTO Linee (CodLinea) VALUES ('0');" 
     .Execute Sql 
     Next 

     Sql = _ 
     "SELECT X.*, L.CodLinea " & _ 
     "FROM (" & _ 
     " SELECT TOP 1 'LBASE' AS CodLinea, 'Linea Base' AS Descrizione FROM ParametriAzienda " & _ 
     ") AS X LEFT JOIN Linee AS L " & _ 
     "ON X.CodLinea = L.CodLinea" 

    Dim rs 
    Set rs = .Execute(Sql) 
    MsgBox rs.GetString(2, , vbTab & vbTab, , "<null>") 

    Sql = Replace$(Sql, "TOP 1", "DISTINCT") 

    Set rs = .Execute(Sql) 
    MsgBox rs.GetString(2, , vbTab & vbTab, , "<null>")   
    End With 
    Set .ActiveConnection = Nothing 
    End With 
End Sub 
+0

ええと、これは問題ではないと思います。私たちはTOP 1を使わずに試してみましたが、それでも5行になります。DISTINCTもそうです。実際、ParametriAziendaには1行しかありません。 – IssamTP

+0

@IssamTP:自分のコードを実行しようとしましたか?あなたは別の結果を得ますか?そうでない場合は、シナリオをよりよく反映するようにコードを変更できますか?例えばおそらくあなたのデータは根本的に異なっているので、実際には何を示唆しているに過ぎません。 – onedaywhen

+0

私はあなたに知らせます、また私はdbのデータについていくつかの情報を追加しました。 – IssamTP