Вы можете получить самый ранний заказ через лимит и упорядочить по дате.
Затем вы можете оставить соединение, чтобы получить этот заказ и любой другой заказ, который по крайней мере имеет те же предметы.
Затем, получив эти идентификаторы заказа из результата подзапроса, вы можете получить детали заказа.
SELECT o.*
FROM
(
SELECT DISTINCT ord2.ID as OrderId
FROM
(
SELECT ID, CustomerId, Status
FROM OrdersTable
WHERE Status = 0
ORDER BY created_at
LIMIT 1
) AS ord1
JOIN PurchasedProductsTable AS pprod1
ON pprod1.OrderId = ord1.ID
LEFT JOIN OrdersTable ord2
ON ord2.CustomerId = ord1.CustomerId
AND ord2.Status = ord1.Status
LEFT JOIN PurchasedProductsTable pprod2
ON pprod2.OrderId = ord2.ID
AND pprod2.itemSku = pprod1.itemSku
AND pprod2.Qty = pprod1.Qty
GROUP BY ord1.CustomerId, ord1.ID, ord2.ID
HAVING COUNT(pprod1.itemSku) = COUNT(pprod2.itemSku)
) q
JOIN OrdersTable AS o ON o.ID = q.OrderId;
Тест на RexTester здесь
В cmd.exe, ДЛЯ/F %variable В (имени файла) ДЕЙСТВИТЕЛЬНО управляют, должен дать Вам, что Вы хотите. Это читает содержание имени файла (и они могли быть больше чем одними именами файлов) одна строка за один раз, поместив строку в %variable (более или менее; сделайте СПРАВКУ ДЛЯ в командной строке). Если никто больше не предоставит командный сценарий, то я попытаюсь.
Править: моя попытка для сценария cmd.exe, который делает требуемый:
@echo off
rem first arg is the file containing filenames
rem second arg is the target directory
FOR /F %%f IN (%1) DO IF EXIST %2\%%f ECHO %%f exists in %2
Отметьте, сценарий выше должен быть сценарием; ДЛЯ цикла в .cmd или .bat файле, по некоторой странной причине, должен иметь двойные знаки процента перед ее переменной.
Теперь, для сценария, который работает с bash|ash|dash|sh|ksh:
filename="${1:-please specify filename containing filenames}"
directory="${2:-please specify directory to check}
for fn in `cat "$filename"`
do
[ -f "$directory"/"$fn" ] && echo "$fn" exists in "$directory"
done
Bash:
while read f; do
[ -f "$f" ] && echo "$f" exists
done < file.txt
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)
В Windows:
type file.txt >NUL 2>NUL
if ERRORLEVEL 1 then echo "file doesn't exist"
(Это не может быть лучшим способом сделать это; это - способ, о котором я знаю; см. также http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx),
В Bash:
if ( test -e file.txt ); then echo "file exists"; fi
Обратите внимание, однако, что использование файловых систем по умолчанию и под Win32 и под *отклоняет нет никакого способа гарантировать атомарность операции, т.е. если Вы проверяете на существование файлов A, B, и C, некоторый другой процесс или поток, возможно, удалили файл A после передачи его и в то время как Вы искали B и C.
Файловые системы, такие как Транзакционный NTFS могут преодолеть это ограничение.
Я хотел добавить один маленький комментарий к большинству вышеупомянутых решений. Они на самом деле не тестируют, если конкретный файл существует или нет. Они проверяют, чтобы видеть, существует ли файл, и у Вас есть доступ к нему. Для файла совершенно возможно существовать в каталоге, которому у Вас нет разрешения, в этом случае, Вы не сможете просмотреть файл даже при том, что это существует.