1

フィールドと各レコードのフィールドをdate持つテーブルがあります。time(7)レコードがデータベースに挿入されると、挿入日の日付と挿入時刻がログに記録されます。

ここで、レコードが重複する可能性があるため、最初に発生した今日の日付のTable1 INNER JOIN Table2すべてのレコードを選択したいと思います。フィールドを使用して、今日の日付の最小時間を選択しようとしましたが、結果は返されません。クエリは、異なる時間で 2 回ログに記録されるため、今日の日付で 1 つの結果を返すはずです。今日の日付を持つ製品の最初のオカレンスを選択するにはどうすればよいですか?time(7)record1 = 'ABC'

例:

SELECT ProductName, Description, Quantity,
FROM Products
INNER JOIN Transactions
    ON Products.ProductID = Transactions.ProductID
WHERE Transactions.ProductID = 'A6612'
    AND CONVERT(VARCHAR(20), `Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
    AND Time_Tracked = (
        SELECT min(Time_Tracked)
        FROM Transactions
        )
    AND Country = 'United States'
4

3 に答える 3

2

EXISTS 演算子でオプションを使用します。また、VARCHAR データ型への CONVERT の代わりに CAST 関数を使用すると、効率的でない条件 (または述語) を回避できます。

SELECT p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND EXISTS (                      
              SELECT 1
              FROM Transactions t2
              WHERE t.ProductID = t2.ProductID
                AND CAST(t2.Date_Tracked AS date) = CAST(GETDATE() AS date)
              HAVING MIN(t2.Time_Tracked) = t.Time_Tracked                      
              ) 
  AND Country = 'United States'

リクエストが 1 つのレコードを返す場合は、TOP 句で ORDER BY 句を使用するだけです。

SELECT TOP 1 p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND p.Country = 'United States'
ORDER BY t.Time_Tracked

最後に、Date_Tracked が datetime 型の場合:

SELECT TOP 1 p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND p.Country = 'United States'
ORDER BY CAST(t.Date_Tracked AS time)
于 2013-04-26T09:20:14.653 に答える
0

rowid を使用してみましたか?

SELECT ProductName, Description, Quantity,
FROM Products
INNER JOIN Transactions
    ON Products.ProductID = Transactions.ProductID
WHERE Transactions.ProductID = 'A6612'
    AND CONVERT(VARCHAR(20), `Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
    AND Transactions.rowid = (SELECT min(rowid)
        FROM Transactions group by productid,date) --This will give you the minimum rowid 
    AND Country = 'United States'                    --grouped by productid and date.  
于 2013-04-26T09:35:41.920 に答える
0

クエリは次のようになります。

SELECT ProductName, Description, Quantity,
FROM Products
INNER JOIN Transactions
    ON Products.ProductID = Transactions.ProductID
WHERE Transactions.ProductID = 'A6612'
    AND CONVERT(VARCHAR(20), Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
    AND Time_Tracked = (
        SELECT min(Time_Tracked)
        FROM Transactions
        WHERE CONVERT(VARCHAR(20), Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
        )
    AND Country = 'United States'
于 2013-04-26T09:20:09.330 に答える